2013-10-23 55 views
0

我有一個抽象類,它看起來像這樣:使用反射和getValue問題

public abstract class PageObjectsBase 
{ 
    public abstract string FriendlyName { get; } 
    public abstract string PageObjectKeyPrefix { get; } 
    public abstract string CollectionProperty { get; } 
} 

以及從PageObjectsBase派生的類:

public class PageRatingList : PageObjectsBase 
{ 
    public IList<PageRating> PageRatings { get; set; } 

    public PageRatingList() 
    { 
     this.PageRatings = new List<PageRating>(); 
    } 

    public override string CollectionProperty 
    { 
     get 
     { 
      var collectionProperty = typeof(PageRatingList).GetProperties().FirstOrDefault(p => p.Name == "PageRatings"); 
      return (collectionProperty != null) ? collectionProperty.Name : string.Empty; 
     } 
    } 

    public override string FriendlyName 
    { 
     get 
     { 
      return "Page feedback/rating"; 
     } 
    } 

    public override string PageObjectKeyPrefix 
    { 
     get 
     { 
      return "pagerating-"; 
     } 
    } 
} 

和PageRatingList.PageRatings是持有PageRating類以下集合:

public class PageRating : PageObjectBase 
{ 
    public int Score { get; set; } 
    public string Comment { get; set; } 
    public string Name { get; set; } 
    public string Email { get; set; } 
} 

PageRatingList正在存儲在數據庫中(EPiS erver的動態數據存儲,更具體地說使用頁面對象管理器)。我需要創建一些報告功能,並且實質上是加載從PageObjectBase派生的所有報告。當涉及到返回數據時,代碼在編譯時永遠不會知道它要加載的數據類型,所以我使用了Reflection。在我的報告I類有:

 //this gives me the right type 
     var type = Type.GetType("MyNameSpace.PageRatingList", true); 

     var startPageData = this._contentRepository.Get<PageData>(startPage); 
     PageObjectManager pageObjectManager = new PageObjectManager(startPageData); 

     //this loads the instances from the DB 
     var props = pageObjectManager.LoadAllMetaObjects() 
         .FirstOrDefault(o => o.StoreName == "Sigma.CitizensAdvice.Web.Business.CustomEntity.PageRatingList"); 

     //this gives me 4 PropertyInfo objects (IList: PageRatings, string : CollectionProperty, string :FriendlyName, string : PageObjectKeyPrefix) 
     var properties = props.Value.GetType().GetProperties(); 

我可以通過的PropertyInfo對象使用然後遍歷:

 foreach (var property in properties) 
     { 
      //extract property value here 
     } 

我遇到的問題是,我無法弄清楚如何讓每一個的值屬性信息對象。另外,其中一個屬性是List類型,我們再次不知道T的類型,直到運行時。所以我還需要一些邏輯來檢查PropertyInfo對象中的一個是否爲List類型,然後提供對List中每個屬性的訪問權限 - 列表類型爲PageRating。

任何人都可以幫忙嗎?我過去並沒有真正使用過反射,所以我正在通過它,無論是對還是錯!

非常感謝 鋁

回答

0

我可missunderstanding的問題,但我想你可以使用這樣的事情:

var props = new PageRatingList(); /*actual instanse of the object, in your case, i think "props.Value" */ 

    var properties = typeof(PageRatingList).GetProperties(); 

    foreach (var property in properties) 
    { 
     if (property.PropertyType == typeof(IList<PageRating>)) 
     { 
      IList<PageRating> list = (IList<PageRating>)property.GetValue(props); 

      /* do */ 
     } 
     else 
     { 
      object val = property.GetValue(props); 
     } 
    } 

希望這有助於找到解決方案。

+0

我不確定發佈與我所寫的答案完全相同的答案的確切時間點,但是之後半小時。 – varocarbas

+0

呃...相同,相同,不是。實際上你的代碼不能編譯,因爲GetValue至少需要兩個參數(你甚至沒有測試代碼?)。每次更加困惑你的參與的確切點在這裏。 – varocarbas