我正在尝试使用Emit生成映射代码(将属性从一个对象映射到另一个对象)。如果两种类型匹配(源和目标),我有它工作,但我不能让它在类型不匹配的实例中工作,我需要在映射中调用静态方法。下面是我认为可以工作的代码但是我得到一个方法不存在错误,即使它确实。我猜我的发出呼叫是不正确的。有什么建议吗?
foreach (var map in maps)
{
il.Emit(OpCodes.Ldarg_1);
il.Emit(OpCodes.Ldarg_0);
il.EmitCall(OpCodes.Callvirt, map.SourceProperty.GetGetMethod(), null);
if (map.SourceProperty.PropertyType == map.TargetProperty.PropertyType)
il.EmitCall(OpCodes.Callvirt, map.TargetProperty.GetSetMethod(), null);
else if (map.TargetProperty.PropertyType.Name == "ObjectId" && map.SourceProperty.PropertyType.Name.ToLower() == "string") {
var method = typeof(ObjectId).GetMethod("Parse", BindingFlags.Public | BindingFlags.Static, Type.DefaultBinder, new Type[] { typeof(string) }, null);
il.EmitCall(OpCodes.Callvirt, method , null);
}
}
il.Emit(OpCodes.Ret);
答案 0 :(得分:2)
您应该可以使用EmitCall
而非CallVirt
而不是{{1}}来调用它。
答案 1 :(得分:0)
这是抛出错误的行吗?
var method = typeof(ObjectId).GetMethod("Parse", BindingFlags.Public | BindingFlags.Static, Type.DefaultBinder, new Type[] { typeof(string) }, null);
也许你可以试试
Type ObjectIDType = typeof(ObjectId);
MethodInfo method = ObjectIDType.GetMethod("Parse", new Type[] { typeof(string) });
也许parse将对象作为参数而不是字符串?
错误讯息是什么?