2012-08-27 5 views
1

J'ai une classe de base qui a une liste incorporée qui peut être utilisée par toutes les classes enfants pour renvoyer une collection triée.Utiliser Emit IL avec des classes internes?

J'avais utilisé Activator.CreateInstance(), mais c'est TERRBILY lent par rapport à une simple nouvelle fonction().

J'ai trouvé un moyen d'utiliser Emit IL pour le faire presque aussi vite que new(), mais si mes classes ne sont pas publiques, j'obtiens une erreur MethodAccessException. Cela semble être commun.

Y a-t-il un moyen de contourner cela?

code pour générer des classes ici: http://codeblocks.codeplex.com/wikipage?title=FasterActivator%20Sample

code utilisé avec ce qui précède ici:

public static List<T> SortedCollection<T>(SPListItemCollection items, ListSortType sortType, List<Vote> votes) where T : IVotable 
{ 
    var returnlist = new List<T>(); 
    var functionCreator = FastActivator.GenerateFunc<Func<SPListItem, List<Vote>, T>>(); 
    for (int i = 0; i < items.Count; i++) { returnlist.Add(functionCreator(items[i], votes)); } 

    //Old code here 
    //Type genericType = typeof(T); 
    //for (int i = 0; i < items.Count; i++) { returnlist.Add((T)Activator.CreateInstance(genericType, new object[] { items[i], votes })); } 

    switch (sortType) 
    { 
     case ListSortType.Hot: 
      returnlist.Sort((p1, p2) => p2.HotScore.CompareTo(p1.HotScore)); 
      break; 
     case ListSortType.Top: 
      returnlist.Sort((p1, p2) => p2.VoteTotal.CompareTo(p1.VoteTotal)); 
      break; 
     case ListSortType.Recent: 
      returnlist.Sort((p1, p2) => p2.CreatedDate.CompareTo(p1.CreatedDate)); 
      break; 
     } 
     return returnlist; 
    } 

    //Usage 
    //Post : BaseClass which has above method 
    return Post.SortedCollection<Post>(listItems,sortType,votes); 

Répondre

5

Vous pouvez utiliser la méthode DynamicMethod Constructor (String, Type, Type[], Type) pour générer une méthode associée à la classe qui est des membres que vous souhaitez accéder à.

La méthode générée aura un accès complet à tous les membres dans le type que vous associez avec, et toutes les méthodes internes et les membres de la classe auront accès dans son module.

Questions connexes