簡體   English   中英

我如何反思並從內部類中獲取價值?

[英]How can I reflect over and get the value from this inner class?

用戶向我傳遞了一個帶有類名的字符串,以及另一個帶有該類的字段的字符串,我應該將其用於提取一些信息。 這是幾個示例類; 它們都繼承自相同的基類:

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的成員的值。

我將Int32FieldStringField在內部執行的操作的詳細信息,但足以說明這兩種類型都有一個Expression成員,這是我需要使用的字符串。

我正在嘗試使用反射來做到這一點,並且到目前為止:

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

...此時, fieldListing是一個對象,該對象在引擎蓋下為PersonRow.RowFields類型。 但是我有點想超越這一點,因為我不確定如何枚舉該數組並從我感興趣的字段中提取Expression值?

我稍作修改,然后刪除了看起來像您的模型的東西,最后得到了以下結果:

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!"

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM