1

ソートされたコレクションを返すためにすべての子クラスで使用できるリストが埋め込まれた基本クラスがあります。

私は を使用していました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);
4

1 に答える 1

5

DynamicMethod Constructor (String, Type, Type[], Type)メソッドを使用して、アクセスしたいメンバーのクラスに関連付けられたメソッドを生成できます。

生成されたメソッドは、関連付けた型のすべてのメンバーに完全にアクセスでき、クラスがそのモジュールでアクセスできるすべての内部メソッドとメンバーにアクセスできます。

于 2012-08-27T21:27:44.207 に答える