Reflection.Emit 访问动态构造类的基类中的字段



我正在使用Reflection.Emit来定义动态类型。该类继承自泛型基类。在 C# 中,这一切如下所示:

public abstract class DataReaderMapper<T>
{
  protected readonly IDataReader reader_;
  protected DataReaderMapper(IDataReader reader) {
    reader_ = reader;
  }
}
public class SomeDataReaderMapper: DataReaderMapper<ISomeInterface> {
  public string SomeProperty {
    get { return reader_.GetString(0); }
  }
}

反射.发射部分:

Type MakeDynamicType() {
    TypeBuilder builder = module_.DefineType(
      GetDynamicTypeName(),
      TypeAttributes.Public |
        TypeAttributes.Class |
        TypeAttributes.AutoClass |
        TypeAttributes.AutoLayout,
      typeof (DataReaderMapper<T>),
      new Type[] {type_t_});
    ConstructorBuilder constructor =
      type.DefineConstructor(MethodAttributes.Public |
         MethodAttributes.HideBySig |
         MethodAttributes.SpecialName |
         MethodAttributes.RTSpecialName,
        CallingConventions.Standard, new Type[] {typeof (IDataReader)});
     ConstructorInfo data_reader_mapper_ctor = typeof (DataReaderMapper<T>)
       .GetConstructor(new Type[] {typeof (IDataReader)});
     ILGenerator il = constructor.GetILGenerator();
     il.Emit(OpCodes.Ldarg_0);
     il.Emit(OpCodes.Ldarg_1);
     il.Emit(OpCodes.Call, data_reader_mapper_ctor);
     il.Emit(OpCodes.Ret);
     PropertyBuilder property_builder = builder
       .DefineProperty(property.Name, PropertyAttributes.HasDefault,
         property.PropertyType, null);
     MethodBuilder get_method = builder.DefineMethod("get_" + property.Name,
       MethodAttributes.Public |
         MethodAttributes.SpecialName |
         MethodAttributes.HideBySig);
     ILGenerator il = get_method.GetILGenerator();
     il.Emit(OpCodes.Ldarg_0);
     // *********************
     //  How can I access the reader_ field of the base class.
     // *********************
     property_builder.SetGetMethod(get_method);
}

问题是我正在尝试使用反射.发出,但我不知道如何访问受保护的字段基类。显然可以生成代码来执行此操作,因为C# 代码工作正常。我想编译器可能可以做到这一点实际上不受Reflection.Emit的支持,但我希望这不是一个这些案例。

有没有人知道如何访问基类中的字段这个实例?

感谢您的任何帮助

你的代码也有很多其他问题,但是标识符T如何在你的MakeDynamicType方法中绑定呢? 也就是说,我希望您根据 C# 示例使用 typeof(DataReaderMapper<ISomeInterface>) 而不是typeof(DataReaderMapper<T>)

无论如何,您应该能够执行以下操作:

var fld = typeof(DataReaderMapper<ISomeInterface>)
    .GetField("reader_", BindingFlags.NonPublic | BindingFlags.Instance);

以获取字段,然后使用 il.Emit(OpCodes.Ldfld, fld) 从实例获取字段。

最新更新