我想使用 TypeBuilder 创建具有某些属性的接口。我正在尝试修改“如何动态创建类”问题中已接受的解决方案。 这是我要创建的界面示例:
public interface ISample
{
public decimal Amount { get; set; }
public decimal Price { get; set; }
public double Quantity { get; set; }
}
这是我用于创建界面的代码:
private static TypeBuilder GetInterfaceTypeBuilder(string TypeName)
{
var typeSignature = TypeName;
var an = new AssemblyName(typeSignature);
AssemblyBuilder assemblyBuilder = AssemblyBuilder.DefineDynamicAssembly(new AssemblyName(Guid.NewGuid().ToString()),
AssemblyBuilderAccess.Run);
ModuleBuilder moduleBuilder = assemblyBuilder.DefineDynamicModule("MainModule");
TypeBuilder tb = moduleBuilder.DefineType(typeSignature, TypeAttributes.Interface | TypeAttributes.Abstract);
return tb;
}
我尝试创建这样的属性:
private static void CreateInterfaceProperty(TypeBuilder tb, string propertyName, Type propertyType)
{
PropertyBuilder propertyBuilder = tb.DefineProperty(propertyName, PropertyAttributes.HasDefault, propertyType, null);
}
此方法创建 Interface 类型的实例:
public static Type CompileInterfaceType(string TypeName, List<Field> yourListOfFields)
{
TypeBuilder tb = GetTypeBuilder(TypeName);
// NOTE: assuming your list contains Field objects with fields FieldName(string) and FieldType(Type)
foreach (var field in yourListOfFields)
{
CreateInterfaceProperty(tb, field.FieldName, field.FieldType);
}
Type objectType = tb.CreateType();
return objectType;
}
项目编译并运行,但是当我检查创建的实例的属性信息时,没有定义属性。
如何添加像 ISample 中所示的属性?
DefineProperty()
之外,您还需要使用非常有趣的命名方法
SetSetMethod()
和SetGetMethod()
来定义getter和setter。MethodBuilder getterBuilder = ...;
MethodBuilder? setterBuilder = ...;
PropertyBuilder propertyBuilder = typeBuilder.DefineProperty(
propertyInfo.Name, PropertyAttributes.HasDefault,
propertyInfo.PropertyType, null );
propertyBuilder.SetGetMethod( getterBuilder );
if( setterBuilder != null )
propertyBuilder.SetSetMethod( setterBuilder );