如何发出带有属性的接口?

问题描述 投票:0回答:1

我想使用 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 中所示的属性?

c# reflection
1个回答
0
投票
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 );

© www.soinside.com 2019 - 2024. All rights reserved.