C# Emit访问动态构造类的基类中的字段

C# Emit访问动态构造类的基类中的字段,c#,.net,reflection,reflection.emit,C#,.net,Reflection,Reflection.emit,我正在使用Reflection.Emit定义一个动态类型。该类继承自 泛型基类。在C#中,这一切都是这样的: public abstract class DataReaderMapper<T> { protected readonly IDataReader reader_; protected DataReaderMapper(IDataReader reader) { reader_ = reader; } } public class SomeDataR

我正在使用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); }
  }
}
公共抽象类DataReaderMapper
{
受保护的只读IDataReader读取器;
受保护的DataReaderMapper(IDataReader读取器){
读取器=读取器;
}
}
公共类SomeDataReaderMapper:DataReaderMapper{
公共字符串属性{
获取{return reader_u.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);
}
Type MakeDynamicType(){
TypeBuilder=模块\定义类型(
GetDynamicTypeName(),
TypeAttributes.Public|
TypeAttributes.Class|
TypeAttributes.AutoClass|
TypeAttributes.AutoLayout,
类型(DataReaderMapper),
新类型[]{Type_t});
构造器构造器构造器=
type.DefineConstructor(MethodAttributes.Public)|
MethodAttributes.hidebysing|
MethodAttributes.SpecialName|
MethodAttributes.RTSpecialName,
CallingConventions.标准,新类型[]{typeof(IDataReader)});
ConstructorInfo data\u reader\u mapper\u ctor=typeof(DataReaderMapper)
.GetConstructor(新类型[]{typeof(IDataReader)});
ILGenerator il=constructor.GetILGenerator();
il.Emit(操作码.Ldarg_0);
il.Emit(操作码Ldarg_1);
il.Emit(操作码调用、数据读取器映射器);
发射(操作码Ret);
PropertyBuilder属性_builder=builder
.DefineProperty(property.Name、PropertyAttributes.HasDefault、,
property.PropertyType,空);
MethodBuilder get\u method=builder.DefineMethod(“get\u”+property.Name,
MethodAttributes.Public|
MethodAttributes.SpecialName|
方法属性(隐藏);
ILGenerator il=get_method.GetILGenerator();
il.Emit(操作码.Ldarg_0);
// *********************
//如何访问基类的reader\字段。
// *********************
属性_builder.SetGetMethod(get_方法);
}
问题是我试图使用 反射。发射,但我不知道如何访问 基类。由于 C代码工作得很好。我想编译器可能可以做到这一点 反射实际上不支持。发射,但我希望这不是一个 在这些案件中

有人知道如何访问中基类中的字段吗 这个例子


感谢您的帮助

您的代码也有许多其他问题,但是标识符
T
MakeDynamicType
方法中是如何绑定的?也就是说,我希望您使用的是
typeof(DataReaderMapper)
,而不是
typeof(DataReaderMapper)
,基于您的C#示例

在任何情况下,您都应该能够执行以下操作:

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

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

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

在任何情况下,您都应该能够执行以下操作:

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

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

您有什么问题,请显示一些代码?如果您可以使用
Reflection.Emit
发布到目前为止的尝试,可能会有所帮助。您有什么问题,显示一些代码?如果您可以使用
Reflection.Emit
发布到目前为止的尝试,可能会有所帮助。MakeDynamicType是DataReaderMapper内部类的函数MakeDynamicType是DataReaderMapper内部类的函数