使用Emit IL和内部类?

时间:2012-08-27 21:14:24

标签: c# performance reflection instantiation reflection.emit

我有一个基类,它有一个嵌入式List,所有子类都可以使用它来返回已排序的集合。

我一直在使用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);

1 个答案:

答案 0 :(得分:5)

您可以使用DynamicMethod Constructor (String, Type, Type[], Type)方法生成与您要访问的成员的类相关联的方法。

生成的方法可以完全访问与其关联的类型中的所有成员,以及该类在其模块中可以访问的所有内部方法和成员。