我想使用TypeBuilder构建一个与接口匹配的类型。它的基类型将是对象,因为我没有任何抽象点。
有问题的界面有一个像so ::
这样的属性public interface IFoo{
int Property{get;}
}
我是否需要实际创建PropertyBuilder?或者我可以放弃为int get_Property()
方法发布方法吗?
答案 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_方法,我会感到非常惊讶。