代码之家  ›  专栏  ›  技术社区  ›  Michael B

如果我使用TypeBuilder使用属性构建类型,是否需要使用propertyBuilder?

c#
  •  4
  • Michael B  · 技术社区  · 15 年前

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

    所讨论的接口具有如下属性:

    public interface IFoo{
        int Property{get;}
    }
    

    我真的需要创建一个PropertyBuilder吗?或者我能不能就这样 int get_Property() 方法?

    2 回复  |  直到 15 年前
        1
  •  5
  •   Marc Gravell    15 年前

    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;
    
        2
  •  0
  •   TheEvilPenguin    15 年前

    我认为您需要使用PropertyBuilder,.Net中的一个属性并不像使用get和/或set方法那么简单,还需要额外的元数据。

    不过,我从来没有使用过TypeBuilder,但是如果你能通过发出get_u方法来逃脱惩罚,我会非常惊讶。