2009-12-17 3 views
2

Dans mon CMS, j'ai un tas de modules qui me permettent de faire des choses intelligentes. J'essaie de les utiliser pour sortir une liste de leurs objets enfants par réflexion, mais je suis coincé avec le niveau de génériques impliqués.Comment puis-je itérer une méthode reflétée générique?

J'ai aussi loin que cette méthode:

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

qui retourne une liste. Chaque modulepecificobject est lié une interface IItemListable qui a les méthodes dans lesquelles j'essaye d'accéder.

Je ne suis pas sûr que je peux jeter ou itérer l'objet myList comme un ensemble d'objets IItemListable accéder aux méthodes requises.

Merci

Quelques-unes des classes:

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 
} 

Répondre

3

Vous peut diriger la distribution pendant l'itération:

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

} 

Edit: Je mieux marquer ChildItems comme virtuel dans la base, vous pouvez alors écrire

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

et

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

sans qu'il soit nécessaire de jeter, en évitant l'utilisation du nouveau mot-clé et sans avoir à utiliser la réflexion.

+0

Acclamations le wew n'était pas nécessaire Je l'ai changé en un override, qui a hérité d'un test précédent que je faisais –

Questions connexes