引发了不明确的MatchException
本文关键字:MatchException 不明确 | 更新日期: 2023-09-27 18:21:51
我写了这个代码:
MethodInfo method2 = typeof(IntPtr).GetMethod(
"op_Explicit",
BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic,
null,
new Type[]{
typeof(IntPtr),
},
null
);
如果我试图运行,得到一个模糊的matchexception,我该如何解决这个问题?感谢
我试图获得的方法是op_Explicit(intptr)返回值int32
没有用于在不同类型的方法之间进行选择的标准重载。你必须自己找到方法。您可以编写自己的扩展方法,如下所示:
public static class TypeExtensions {
public static MethodInfo GetMethod(this Type type, string name, BindingFlags bindingAttr, Type[] types, Type returnType ) {
var methods = type
.GetMethods(BindingFlags.Static | BindingFlags.Public)
.Where(mi => mi.Name == "op_Explicit")
.Where(mi => mi.ReturnType == typeof(int));
if (!methods.Any())
return null;
if (methods.Count() > 1)
throw new System.Reflection.AmbiguousMatchException();
return methods.First();
}
public static MethodInfo GetExplicitCastToMethod(this Type type, Type returnType )
{
return type.GetMethod("op_Explicit", BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic, new Type[] { type }, returnType);
}
}
然后使用它:
MethodInfo m = typeof(IntPtr).GetExplicitCastToMethod(typeof(int));
准确地说,IntPtr类中有两个定义的强制转换:
public static explicit operator IntPtr(long value)
public static explicit operator long(IntPtr value)
并且System.Int64类中没有定义强制转换(long是Int64的别名)。
您可以将Convert.ChangeType
用于此目的
有多个显式运算符允许IntPtr
作为参数,它们的不同之处仅在于返回类型。尝试使用这个问题的解决方案,通过不仅指定参数类型,还指定返回类型来获得您感兴趣的方法:
只获取Type.GetMethods()中具有特定签名的方法