2012-08-27 41 views
1

我有一個基類,它有一個嵌入列表,可供所有子類使用以返回一個已排序的集合。在內部類中使用Emit IL?

我一直在使用Activator.CreateInstance(),但與簡單的new()函數相比,這是TERRBILY較慢。

我發現了一種使用Emit IL的方法,它的速度幾乎和new()一樣快,但是如果我的類不公開,我會得到一個MethodAccessException錯誤。這似乎很常見。

有沒有辦法解決這個問題?

代碼在這裏生成類: http://codeblocks.codeplex.com/wikipage?title=FasterActivator%20Sample

代碼被上述這裏使用:

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

回答

5

可以使用DynamicMethod Constructor (String, Type, Type[], Type)方法來生成與類相關聯的方法,誰的會員你想訪問至。

生成的方法將全部訪問所有成員,其類型與您關聯的類型以及該類在其模塊中可以訪問的所有內部方法和成員。