我有一個抽象類,它看起來像這樣:使用反射和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。
任何人都可以幫忙嗎?我過去並沒有真正使用過反射,所以我正在通過它,無論是對還是錯!
非常感謝 鋁
我不確定發佈與我所寫的答案完全相同的答案的確切時間點,但是之後半小時。 – varocarbas
呃...相同,相同,不是。實際上你的代碼不能編譯,因爲GetValue至少需要兩個參數(你甚至沒有測試代碼?)。每次更加困惑你的參與的確切點在這裏。 – varocarbas