IIRC“扩展参数并将第一个作为目标”技巧仅适用于引用类型,例如
string
-大概是因为这个
例子
方法调用变为静态调用
住址
而不是简单地
加载
这两个论点。您可以通过以下方式绕过它(不是很优雅):
var dm = new DynamicMethod(nameof(double.CompareTo), typeof(int),
new[] { typeof(double), typeof(double) });
var il = dm.GetILGenerator();
il.Emit(OpCodes.Ldarga_S, 0); // load "ref arg0"
il.Emit(OpCodes.Ldarg_1); // load "arg1"
il.Emit(OpCodes.Call, method); // call CompareTo
il.Emit(OpCodes.Ret);
var func = (Func<double, double, int>)dm.CreateDelegate(
typeof(Func<double, double, int>));
Func<double, double, int> func = (x,y) => x.CompareTo(y);