ソートされたコレクションを返すためにすべての子クラスで使用できるリストが埋め込まれた基本クラスがあります。
私は を使用していましたActivator.CreateInstance()
が、これは単純な new() 関数と比較して非常に遅いです。
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);