C# 我如何反思并从这个内部类中获得价值?

C# 我如何反思并从这个内部类中获得价值?,c#,reflection,C#,Reflection,用户正在向我传递一个带有类名的字符串和另一个带有该类字段的字符串,我应该使用该类来提取一些信息。下面是几个示例类;它们都继承自同一基类: public class PersonRow : Row { public static readonly RowFields Fields = new RowFields.Init(); public class RowFields : RowFieldBase { public Int32Field Id; pu

用户正在向我传递一个带有类名的字符串和另一个带有该类字段的字符串,我应该使用该类来提取一些信息。下面是几个示例类;它们都继承自同一基类:

public class PersonRow : Row
{
   public static readonly RowFields Fields = new RowFields.Init();

   public class RowFields : RowFieldBase
   {
      public Int32Field Id;
      public StringField FirstName;
      public StringField LastName;
   }

}


public class AutomobileRow : Row
{
  public static readonly RowFields Fields = new RowFields.Init();

  public class RowFields : RowFieldBase
  {
     public Int32Field Id;
     public StringField PaintColor;
     public StringField EngineSize;
  }
}
用户将给我类似“PersonRow”和“FirstName”的内容,我需要从中深入到
FirstName
字段,并提取名为
Expression
的成员的值

我将不必详细介绍
Int32Field
StringField
在内部所做的工作,但这两种类型都有一个
表达式
成员,这是我需要使用的字符串

我正在尝试使用反射来实现这一点,并且已经做到了这一点:

var myClassType = Type.GetType("PersonRow");
var myFields = myClassType.GetField("Fields", BindingFlags.Public | BindingFlags.Static);
var fieldListing = myFields.GetValue(null);

…此时,
fieldListing
是一个对象,在引擎盖下面,其类型为
PersonRow.RowFields
。然而,我有点纠结于这一点,因为我不知道如何枚举该数组并从我感兴趣的字段中提取
表达式

我稍微修改了一下,删掉了看起来像你的模型,结果是:

public class PersonRow
{
    public static readonly RowFields Fields = new RowFields();

    public class RowFields
    {
        public StringField FirstName = new StringField();
        public StringField LastName = new StringField();
    }
}

public class StringField
{
    public StringField()
    {
        expr = Expression.Constant("It worked!");
    }
    public Expression expr { get; set; }
    public string str { get; set; }
}
现在,本质上我们在寻找
PersonRow.Fields.FirstName.expr的值,这可以通过以下代码完成:

var personRowType = typeof(PersonRow);

var fieldsField = personRowType.GetField("Fields", BindingFlags.Public | BindingFlags.Static);
var fieldsObj = fieldsField.GetValue(null);

var firstNameField = fieldsField.FieldType.GetField("FirstName");
var firstNameObj = firstNameField.GetValue(fieldsObj);

var exprProp = firstNameField.FieldType.GetProperty("expr");
var exprObj = (ConstantExpression)exprProp.GetValue(firstNameObj);

在这里,
exprObj
将正确地成为一个
ConstantExpression
,其值为
“It worked!”

一个
行字段数组?你确定吗?你应该得到它的一个实例。由于您使用的是
type.GetType(“PersonRow”)
,您确定您使用的是正确的类型吗?对不起,您是对的,我想说的是“PersonRow.RowFields的对象”,我这方面的一些糟糕编辑,我现在将予以修复。这非常有效,谢谢。不知道
字段类型
,非常感谢这里的提示。