PropertyBuilder
PropertyBuilderRequest is a request to create PropertyBuilder.
// Create service
IService service = Services.Create((ServiceHandlers.Instance, EmitHandlers.Instance), CachePolicies.Default);
// Request to create type builder
IRequestFor<TypeBuilder> typeBuilder = new TypeBuilderRequest("MyClassWithProperty", TypeAttributes.Public | TypeAttributes.Class | TypeAttributes.AutoClass);
// Initialize property request
IRequestFor<PropertyBuilder> property = new PropertyBuilderRequest(
Name: "MyProperty",
Attributes: PropertyAttributes.None,
PropertyType: typeof(int),
ParameterTypes: null);
In this example we create a backing field.
// Request to create backing field
IRequestFor<FieldBuilder> field = new FieldBuilderRequest("MyField", typeof(int), FieldAttributes.Public);
// Add backing field to type request
typeBuilder = typeBuilder.Append(field);
PropertyBuilderSetSetter is a request to attach a setter method to property.
// Create set method
IRequestFor<MethodBuilder> setter = new MethodBuilderRequest(
Name: "set_MyProperty",
Attributes: MethodAttributes.SpecialName | MethodAttributes.HideBySig | MethodAttributes.Public,
ReturnType: null,
ParameterTypes: typeof(int));
// Create op codes
IRequestFor<ILGenerator> il = ILGeneratorRequest.Default
.Append(OpCodes.Ldarg_0)
.Append(OpCodes.Ldarg_1)
.Append(OpCodes.Stfld, field)
.Append(OpCodes.Ret);
// Add opcodes to method request
setter = setter.Append(il);
// Add setter request to type
typeBuilder.Append(setter);
// Assign setter to property
property = property.Append(new PropertyBuilderSetSetter(setter));
And PropertyBuilderSetGetter is a request to attach a getter method.
// Create get method
IRequestFor<MethodBuilder> getter = new MethodBuilderRequest(
Name: "get_MyProperty",
Attributes: MethodAttributes.SpecialName | MethodAttributes.HideBySig | MethodAttributes.Public,
ReturnType: typeof(int));
// Create op codes
IRequestFor<ILGenerator> il = ILGeneratorRequest.Default
.Append(OpCodes.Ldarg_0)
.Append(OpCodes.Ldfld, field)
.Append(OpCodes.Ret);
// Add opcodes to method request
getter = getter.Append(il);
// Add getter request to type
typeBuilder.Append(getter);
// Assign setter to property
property = property.Append(new PropertyBuilderSetGetter(getter));
Once property request is complete, add it to type request.
// Add property to type request
typeBuilder = typeBuilder.Append(property);
Request an instance and try it.
// Request to build type
IRequestFor<Type> type = new TypeRequest(typeBuilder);
// Request to create new instance
IRequestFor<Object> newRequest = type.NewRequest();
// Print
Console.WriteLine(newRequest.PrintTree());
// Get instance
object instance = service.GetRequired<IRequestFor<object>, object>(newRequest);
// Get property with reflection
PropertyInfo pi = instance.GetType().GetProperty("MyProperty")!;
// Write with reflection
pi.SetValue(instance, 9);
// Read with reflection
int value = (int)pi.GetValue(instance)!;
View complete request
NewRequest └── Type = TypeRequest └── Key = ContextRequest├── Key = "System.Reflection.Emit.TypeBuilder" ├── Value = TypeBuilderRequest │ ├── Name = "MyClassWithProperty" │ └── Attributes = AutoLayout, AnsiClass, Class, Public, AutoClass ├── Requests[0] = FieldBuilderRequest │ ├── Name = "MyField" │ ├── Attributes = Public │ └── FieldType = System.Int32 └── Requests[1] = ContextRequest ├── Key = "System.Reflection.Emit.PropertyBuilder" ├── Value = PropertyBuilderRequest │ ├── Name = "MyProperty" │ ├── Attributes = None │ └── PropertyType = System.Int32 ├── Requests[0] = PropertyBuilderSetSetter │ └── Setter = ContextRequest │ ├── Key = "System.Reflection.Emit.Builder" │ ├── Value = MethodBuilderRequest │ │ ├── Name = "set_MyProperty" │ │ ├── Attributes = PrivateScope, Public, HideBySig, SpecialName │ │ └── ParameterTypes[0] = System.Int32 │ └── Requests[0] = ContextRequest │ ├── Key = "System.Reflection.Emit.ILGenerator" │ ├── Value = ILGeneratorRequest │ ├── Requests[0] = Emit │ │ └── Opcode = ldarg.0 │ ├── Requests[1] = Emit │ │ └── Opcode = ldarg.1 │ ├── Requests[2] = Emit │ │ ├── Opcode = stfld │ │ └── Parameters[0] = FieldBuilderRequest │ └── Requests[3] = Emit │ └── Opcode = ret └── Requests[1] = PropertyBuilderSetGetter └── Getter = ContextRequest ├── Key = "System.Reflection.Emit.Builder" ├── Value = MethodBuilderRequest │ ├── Name = "get_MyProperty" │ ├── Attributes = PrivateScope, Public, HideBySig, SpecialName │ └── ReturnType = System.Int32 └── Requests[0] = ContextRequest ├── Key = "System.Reflection.Emit.ILGenerator" ├── Value = ILGeneratorRequest ├── Requests[0] = Emit │ └── Opcode = ldarg.0 ├── Requests[1] = Emit │ ├── Opcode = ldfld │ └── Parameters[0] = FieldBuilderRequest └── Requests[2] = Emit └── Opcode = ret
Full Example
Full example
using System;
using System.Reflection;
using System.Reflection.Emit;
using Avalanche.Emit;
using Avalanche.Service;
public class propertybuilder
{
public static void Run()
{
{
// <1>
// Create service
IService service = Services.Create((ServiceHandlers.Instance, EmitHandlers.Instance), CachePolicies.Default);
// Request to create type builder
IRequestFor<TypeBuilder> typeBuilder = new TypeBuilderRequest("MyClassWithProperty", TypeAttributes.Public | TypeAttributes.Class | TypeAttributes.AutoClass);
// Initialize property request
IRequestFor<PropertyBuilder> property = new PropertyBuilderRequest(
Name: "MyProperty",
Attributes: PropertyAttributes.None,
PropertyType: typeof(int),
ParameterTypes: null);
// </1>
// <2>
// Request to create backing field
IRequestFor<FieldBuilder> field = new FieldBuilderRequest("MyField", typeof(int), FieldAttributes.Public);
// Add backing field to type request
typeBuilder = typeBuilder.Append(field);
// </2>
{
// <3>
// Create set method
IRequestFor<MethodBuilder> setter = new MethodBuilderRequest(
Name: "set_MyProperty",
Attributes: MethodAttributes.SpecialName | MethodAttributes.HideBySig | MethodAttributes.Public,
ReturnType: null,
ParameterTypes: typeof(int));
// Create op codes
IRequestFor<ILGenerator> il = ILGeneratorRequest.Default
.Append(OpCodes.Ldarg_0)
.Append(OpCodes.Ldarg_1)
.Append(OpCodes.Stfld, field)
.Append(OpCodes.Ret);
// Add opcodes to method request
setter = setter.Append(il);
// Add setter request to type
typeBuilder.Append(setter);
// Assign setter to property
property = property.Append(new PropertyBuilderSetSetter(setter));
// </3>
}
{
// <4>
// Create get method
IRequestFor<MethodBuilder> getter = new MethodBuilderRequest(
Name: "get_MyProperty",
Attributes: MethodAttributes.SpecialName | MethodAttributes.HideBySig | MethodAttributes.Public,
ReturnType: typeof(int));
// Create op codes
IRequestFor<ILGenerator> il = ILGeneratorRequest.Default
.Append(OpCodes.Ldarg_0)
.Append(OpCodes.Ldfld, field)
.Append(OpCodes.Ret);
// Add opcodes to method request
getter = getter.Append(il);
// Add getter request to type
typeBuilder.Append(getter);
// Assign setter to property
property = property.Append(new PropertyBuilderSetGetter(getter));
// </4>
}
// <5>
// Add property to type request
typeBuilder = typeBuilder.Append(property);
// </5>
// <6>
// Request to build type
IRequestFor<Type> type = new TypeRequest(typeBuilder);
// Request to create new instance
IRequestFor<Object> newRequest = type.NewRequest();
// Print
Console.WriteLine(newRequest.PrintTree());
// Get instance
object instance = service.GetRequired<IRequestFor<object>, object>(newRequest);
// Get property with reflection
PropertyInfo pi = instance.GetType().GetProperty("MyProperty")!;
// Write with reflection
pi.SetValue(instance, 9);
// Read with reflection
int value = (int)pi.GetValue(instance)!;
// </6>
// Print
Console.WriteLine(newRequest.PrintTree());
}
}
}