2017-04-23 62 views
0

因此,如標題所示,我有一個屬性是propertyInfo。我想要得到的是財產,但我似乎無法找到辦法去做。c#反射 - 從PropertyInfo獲取屬性列表

首先我有這個方法:

public object GetPropertyInfo(object parent, String propertyName) 
    { 
     object propInf = null; 

     PropertyInfo[] propList = parent.GetType().GetProperties(); 

     foreach (PropertyInfo pInf in propList) 
     { 
      if (propertyName == pInf.Name) 
      { 
       propInf = pInf; 
      } 
     } 

     return propInf; 
    } 

而且它工作得相當好,假定所提供的「父」對象是一個普通的類,而不是反射型。

但是,返回的一些屬性本身包含我想要訪問的屬性。在這些情況下,我需要將PropertyInfo返回到此方法中,並獲取屬性的另一個PropertyInfo。但是,如果我將PropertyInfo對象放入此方法中,它只會返回PropertyInfo屬性列表(如您所想象的那樣)。

我已閱讀它,似乎我可能想要的是PropertyInfo類的'GetValue'方法。我有點不確定,因爲我似乎無法解析該方法需要什麼。

即使如此,我寫它是這樣:

public object GetPropertyInfo(object parent, String propertyName) 
    { 
     object propInf = null; 

     object o = null; 

     if (parent is PropertyInfo) 
     { 
      PropertyInfo p = (parent as PropertyInfo); 
      o = p.GetValue(p, null); 
     } 
     else 
      o = parent; 

     PropertyInfo[] propList = o.GetType().GetProperties(); 

     foreach (PropertyInfo pInf in propList) 
     { 
      if (propertyName == pInf.Name) 
      { 
       propInf = pInf; 
      } 
     } 

     return propInf; 
    } 

很顯然,我希望第二個會工作。它通過'if'語句正確,承認它是一個PropertyInfo類型,但接下來的部分提供了以下異常:

TargetException:Object與目標類型不匹配。

也許我對'GetValue'犯了一個錯誤,因爲我不完全熟悉它,但是如果我可以在不指定類型的情況下做到這一點,那就太棒了。

回答

5

假設我明白你正在嘗試做的:

PropertyInfo代表的class一個財產沒有意識到實例class財產的被檢查。

GetValue方法,但是,可以爲您提供財產的價值給定的實例

object value = somePropertyInfo.GetValue(someInstance); 
// where someInstance is of the type which has someProperty's represented property. 

如果你想在性能財產你正在檢查你可以使用PropertyInfo.PropertyType.GetProperties();Type但這樣只會讓你的財產Type,而不是具體的屬性(也許派生)Type它包含。

+0

你在這裏已經幫了我很多老運動。非常感謝! – TheFaithfulLearner