3

我写了这段代码:

 MethodInfo method2 = typeof(IntPtr).GetMethod(
            "op_Explicit",
            BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic,
            null,
            new Type[]{
        typeof(IntPtr),

        },
            null

            );

如果我尝试运行我得到一个模糊匹配异常,我该如何解决这个问题?谢谢

我试图得到的方法是 op_Explicit(intptr) 返回值 int32

4

2 回答 2

2

在不同类型的方法之间进行选择没有标准的重载。你必须自己找到方法。您可以编写自己的扩展方法,如下所示:

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用于此目的

于 2013-07-10T10:22:26.957 回答
1

有多个显式运算符允许IntPtr作为参数,它们仅在返回类型上有所不同。尝试使用这个问题的解决方案,通过指定参数类型和返回类型来获取您感兴趣的方法:

仅从 Type.GetMethods() 中获取具有特定签名的方法

于 2013-07-10T10:09:20.997 回答