Как мне повторить общий отраженный метод? - PullRequest
2 голосов
/ 17 декабря 2009

В моей CMS у меня есть множество модулей, которые позволяют мне делать некоторые умные вещи со списком предметов. Я пытаюсь использовать их, чтобы вытащить список своих дочерних объектов с помощью рефлексии, но я застреваю на уровне общего обобщения.

Я дошел до этого метода:

var myList = moduleObj.GetType().GetMethod("ChildItems").Invoke(moduleObj, new object[] { });

, который возвращает список. Каждый объект-специфический объект связан с интерфейсом IItemListable, в котором есть методы, к которым я пытаюсь получить доступ.

Я не уверен, как я могу привести или перебрать объект myList, поскольку набор объектов IItemListable обращается к требуемым методам.

Спасибо

Несколько классов:

public interface IItemListable
{
    IQueryable GetQueryableList();
    string GetIDAsString();
    IItemListable GetItemFromUrl(string url, List<IItemListable> additionalItems);
    bool IsNewItem();
    IItemListable CreateItem<T>(ItemListerControl<T> parentList) where T : class, IItemListable;
    IItemListable LoadItem(string id);
    IItemListable SaveItem();
    RssToolkit.Rss.RssItem ToRssItem();
    void DeleteItem();
    string ItemUrl();
}

public interface IItemListModule<T> where T: IItemListable
{
    List<T> ChildItems();
}


public class ArticlesModule : ItemListModuleBase<Article>, IItemListModule<Article>
{
    #region IItemListModule<Article> Members

    public new List<Article> ChildItems()
    {
        return base.ChildItems().Cast<Article>().Where(a => a.IsLive).ToList();
    }

    #endregion
}

Ответы [ 2 ]

3 голосов
/ 17 декабря 2009

Вы можете выполнять прямое приведение во время итерации:

IList myList = (IList)moduleObj.GetType().GetMethod(
             "ChildItems").Invoke(moduleObj, new object[] { });
foreach (IItemListable o in myList)
{

}

Редактировать: я бы лучше пометил ChildItems как виртуальный в базе, чем вы могли бы написать

public override List<Article> ChildItems()
{
  return base.ChildItems().Where(a => a.IsLive).ToList();
}

и

var myList = moduleObj.ChildItems();
foreach (IItemListable o in myList)
{
}

без необходимости приведения, избегая использования нового ключевого слова и без использования отражения.

1 голос
/ 17 декабря 2009

Может быть, это поможет:

http://devlicio.us/blogs/louhaskett/archive/2007/06/13/how-to-cast-between-list-t-s.aspx

(также некоторые дополнительные ссылки в комментариях)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...