gpt4 book ai didi

c# - 将 Emit IL 与内部类一起使用?

转载 作者:太空宇宙 更新时间:2023-11-03 20:23:23 25 4
gpt4 key购买 nike

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

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

最佳答案

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

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

关于c# - 将 Emit IL 与内部类一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12149699/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com