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