gpt4 book ai didi

C# 动态方法 : return string representation of integer

转载 作者:行者123 更新时间:2023-11-30 17:28:31 26 4
gpt4 key购买 nike

我想创建一个动态方法,它接受 Int32 参数并返回它的字符串表示形式:

public class Item
{
public int Age { get; } = 22;
}

static void CreateDynamicMethod()
{
var ageGet = typeof(Item).GetProperty("Age").GetGetMethod(true);
var intToString = typeof(int).GetMethod("ToString", new Type[] { });

var dm = new DynamicMethod("getAgeString", typeof(string), new[] { typeof(Item) }, typeof(Item).Module);
var il = dm.GetILGenerator();
il.Emit(OpCodes.Ldarg_0); //load Item instance on stack
il.Emit(OpCodes.Callvirt, ageGet); //age 44 on stack
il.Emit(OpCodes.Call, intToString); //call tostring for age, "44" on stack now
il.Emit(OpCodes.Ret); //return "44"
var agestr = (Func<Item, string>)dm.CreateDelegate(typeof(Func<Item, string>));
Console.WriteLine(agestr.Invoke(new Item()));
}

但是该方法失败并出现异常未将对象引用设置为对象的实例。我错过了什么?

更新:我检查了我方法的 C# 版本的 MSIL:

static string GetAge(Item item)
{
return item.Age.ToString();
}

而且我发现我需要在调用 intToString 之前从堆栈中弹出整数。完整版:

var dm = new DynamicMethod("getAgeString", typeof(string), new[] { typeof(Item) }, typeof(Item).Module);
var il = dm.GetILGenerator();
il.DeclareLocal(typeof(int)); //[NEW] declare local integer variable
il.Emit(OpCodes.Ldarg_0); //load Item instance on stack
il.Emit(OpCodes.Callvirt, ageGet); //age 44 on stack now
il.Emit(OpCodes.Stloc_0); //[NEW] pop ineteger from stack to local variable
il.Emit(OpCodes.Ldloca_S, 0); //[NEW] load address of integer variable onto stack
il.Emit(OpCodes.Call, intToString); //call tostring for age, "44" on stack now
il.Emit(OpCodes.Ret); //return "44"
var agestr = (Func<Item, string>)dm.CreateDelegate(typeof(Func<Item, string>));
Console.WriteLine(agestr.Invoke(new Item()));

现在可以了。

最佳答案

我不是 IL 专业人士,但我认为您需要将 int 框起来以在其上调用 ToString。我的猜测是 JIT 将 22 整数值视为指向对象的指针。运行时然后将访问冲突转换为 NRE,这是它为小指针值所做的。

我建议完全放弃反射发射并使用表达式树。简单得多,性能相同。

关于C# 动态方法 : return string representation of integer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52758323/

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