如果我使用TypeBuilder构建一个带有属性的类型,我是否需要使用propertyBuilder?

时间:2010-11-18 01:45:22

标签: c#

我想使用TypeBuilder构建一个与接口匹配的类型。它的基类型将是对象,因为我没有任何抽象点。

有问题的界面有一个像so ::

这样的属性
public interface IFoo{
    int Property{get;}
}

我是否需要实际创建PropertyBuilder?或者我可以放弃为int get_Property()方法发布方法吗?

2 个答案:

答案 0 :(得分:5)

CLI不关心属性,只要所有方法(所有接口真正定义)都具有实现:

var ab = AppDomain.CurrentDomain.DefineDynamicAssembly(
    new AssemblyName("foo"), AssemblyBuilderAccess.RunAndSave);
var mb = ab.DefineDynamicModule("foo");
var tb = mb.DefineType("bar");
tb.AddInterfaceImplementation(typeof(IFoo));
var method = typeof(IFoo).GetProperty("Property").GetGetMethod();
var impl = tb.DefineMethod("impl",
    MethodAttributes.Private | MethodAttributes.Virtual,
    typeof(int), Type.EmptyTypes);
var il = impl.GetILGenerator();
il.Emit(OpCodes.Ldc_I4_7); // because it is lucky
il.Emit(OpCodes.Ret);
tb.DefineMethodOverride(impl, method);

var type = tb.CreateType();
IFoo foo = (IFoo)Activator.CreateInstance(type);
var val = foo.Property;

答案 1 :(得分:0)

我认为你需要使用一个PropertyBuilder - .Net中的一个属性并不像get_和/或set_方法那么简单 - 需要额外的元数据。

我从来没有使用过TypeBuilder,但如果你只是发出一个get_方法,我会感到非常惊讶。