PropertyBuilder
PropertyBuilderRequest is a request to create PropertyBuilder.
// Create service
IService service = Services.Create(Avalanche.Emit.Module.Instance);
// 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",
propertyAttributes: PropertyAttributes.None,
attributes: new object[] { new DataMemberAttribute { Order = 2 } },
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",
methodAttributes: MethodAttributes.SpecialName | MethodAttributes.HideBySig | MethodAttributes.Public,
attributes: null,
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",
methodAttributes: MethodAttributes.SpecialName | MethodAttributes.HideBySig | MethodAttributes.Public,
attributes: null,
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 System.Runtime.Serialization;
using Avalanche.Emit;
using Avalanche.Service;
public class propertybuilder
{
public static void Run()
{
{
// <01>
// Create service
IService service = Services.Create(Avalanche.Emit.Module.Instance);
// 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",
propertyAttributes: PropertyAttributes.None,
attributes: new object[] { new DataMemberAttribute { Order = 2 } },
propertyType: typeof(int),
parameterTypes: null);
// </01>
// <02>
// 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);
// </02>
{
// <03>
// Create set method
IRequestFor<MethodBuilder> setter = new MethodBuilderRequest(
name: "set_MyProperty",
methodAttributes: MethodAttributes.SpecialName | MethodAttributes.HideBySig | MethodAttributes.Public,
attributes: null,
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));
// </03>
}
{
// <04>
// Create get method
IRequestFor<MethodBuilder> getter = new MethodBuilderRequest(
name: "get_MyProperty",
methodAttributes: MethodAttributes.SpecialName | MethodAttributes.HideBySig | MethodAttributes.Public,
attributes: null,
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));
// </04>
}
// <05>
// Add property to type request
typeBuilder = typeBuilder.Append(property);
// </05>
// <06>
// 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)!;
// </06>
// Print
Console.WriteLine(newRequest.PrintTree());
}
}
}