Имам абстрактен клас, който изглежда така:
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-";
}
}
}
И клас PageRating, който PageRatingList.PageRatings държи колекция от:
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 се съхранява в база данни (Dynamic Data Store на EPiServer, по-конкретно с помощта на Page Object Manager). Трябва да създам някаква функционалност за отчитане и по същество зареждам всички отчети, които произтичат от PageObjectBase. Когато става въпрос за връщане на данните, кодът никога няма да знае по време на компилиране какъв тип данни трябва да зареди, така че използвам Reflection. В моя клас по докладване имам:
//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
}
Проблемът, който имам, е, че не мога да разбера как да получа стойността на всеки от обектите propertyinfo. В допълнение, едно от тези свойства е тип List и отново няма да знаем типа T до време на изпълнение. Така че имам нужда и от някаква логика, която проверява дали един от обектите PropertyInfo е от тип List и след това предоставя достъп до всяко от свойствата в List - List е от тип PageRating.
Може ли някой да помогне тук? Не съм използвал наистина отражение в миналото, така че си проправям път през него, правилно или не!
Много благодаря Ал