所以,我最近做了一些实验,发现 Reflection.Emit 似乎并不支持 ECMA 规范中的所有操作码。缺少 3 个操作码:
ldelem.any
stelem.any
no.
(前缀)Reflection API 不支持这些操作码,还是有某种方法可以生成它们?
最佳答案
事实上,你可以。
在 http://msdn.microsoft.com/en-us/library/4xxf1410.aspx 有精彩的演练
两个重要部分是:
创建通用参数:
string[] typeParamNames = {"TFirst", "TSecond"};
GenericTypeParameterBuilder[] typeParams =
myType.DefineGenericParameters(typeParamNames);
GenericTypeParameterBuilder TFirst = typeParams[0];
GenericTypeParameterBuilder TSecond = typeParams[1];
然后创建方法:
Type listOf = typeof(List<>);
Type listOfTFirst = listOf.MakeGenericType(TFirst);
Type[] mParamTypes = {TFirst.MakeArrayType()};
MethodBuilder exMethod =
myType.DefineMethod("ExampleMethod",
MethodAttributes.Public | MethodAttributes.Static,
listOfTFirst,
mParamTypes);
但是,您应该完全了解它,因为泛型参数以多种不同的方式和部分使用(在方法上、参数上、结果类型上、调用时……)。
-update- 如果您想要 .NET 2 特定版本:http://msdn.microsoft.com/en-us/library/4xxf1410%28v=vs.80%29.aspx
页面上的下拉菜单允许您选择可以在其中执行此操作的框架的多个版本。
关于.net - 是否可以将 Reflection.Emit 用于操作码 stelem.any 和 ldelem.any?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13497586/