Проблеми с използване на Reflection и 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-";
        }
    }
}

И клас 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.

Може ли някой да помогне тук? Не съм използвал наистина отражение в миналото, така че си проправям път през него, правилно или не!

Много благодаря Ал


person higgsy    schedule 23.10.2013    source източник


Отговори (1)


Може да не съм разбрал проблема, но мисля, че може да използвате нещо подобно:

   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);
       }
    }

Надяваме се това да ви помогне да намерите вашето решение.

person Ansenagy    schedule 23.10.2013
comment
Не съм сигурен за точния смисъл на публикуване на отговор, идентичен на този, който написах, но половин час след това. - person varocarbas; 23.10.2013
comment
Ами... идентични, идентични, не. Всъщност кодът ви не се компилира, защото GetValue винаги приема поне два аргумента (дори не сте тествали кода?). Всеки път все по-объркани относно точната точка на вашето участие тук. - person varocarbas; 23.10.2013