2009-12-17 48 views
2

在我的CMS中,我有一些模塊可以讓我做一些巧妙的物品列表。我正在嘗試通過反射將它們的子對象列表拉出來,但是我遇到了所涉及的泛型的級別。如何迭代通用反射方法?

我已經得到儘可能這種方法:

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

它返回一個列表。每個modulespecificobject被綁定到一個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 
} 

回答

3

你可以在迭代時直接投射:

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

沒有任何需要轉換,避免了使用的新關鍵字,而不必使用反射。

+0

乾杯不需要我已經改變它爲覆蓋,這是從我以前的測試繼承 – 2009-12-17 11:44:30