我正在尝试按如下方式检索MethodInfo“ToString”:
MethodInfo method = MyType.GetMethod("ToString",
BindingFlags.Public | BindingFlags.Instance);
异常被抛出“发现模糊匹配”。
答案 0 :(得分:6)
您的类型包含多个ToString()
重载,GetMethod
不知道您想要哪一个。
使用以下语法指定您希望不带任何参数的重载:
MethodInfo method = myType.GetMethod("ToString", Type.EmptyTypes);
注意:由于在ToString()
上定义了System.Object
,因此您不需要反射来在未知类型的对象上调用它:
object myObject = ...;
string s = myObject.ToString(); // works
答案 1 :(得分:3)
ToString()
是System.Object
的成员,因此当您打算在未知类型上调用它时,它是您不需要反思的极少数方法之一。
例外是在Tostring的重载中(即int.ToString(string format)
,但要调用其中一个,你必须知道你正在寻找哪一个。
这些重叠导致你看到的错误。你必须具体。
答案 2 :(得分:1)
可能有多种ToString()
方法。例如,double
有四种变体(覆盖virtual object.ToString()
加上三种变体)
尝试
var variants = MyType.GetMethods(BindingFlags.Public | BindingFlags.Instance)
.Where(p => p.Name == "ToString");
它将返回ToString
或者,如果您知道“您的”ToString
var toString = MyType.GetMethod("ToString",
BindingFlags.Public | BindingFlags.Instance,
null, arrayOfParametersType, null);
答案 3 :(得分:1)
您需要指定您想要没有参数的那个:
var method = MyType.GetMethod("ToString",
new Type[0]);
BindingFlags.Public | BindingFlags.Instance
是默认值,无需指定它们。
答案 4 :(得分:0)
MethodInfo method = typeof(MyType).GetMethod("ToString", BindingFlags.Public | BindingFlags.Instance);
这实际上对我有用......
你可能在ToString上有一个重载。 由于您可以使用多个公共的ToString方法(重载),因此该行可以返回多个ToString方法。
你必须使用类似的东西:
GetMethod(字符串名称,类型[]类型)
其中Type []包含您要搜索的方法类型的数组(在您的情况下没有)
(感谢评论,也从中学到了一些东西:)
答案 5 :(得分:0)
ToString
可能会超载。它的种类很多。
首先,您应该检查您要调用的ToString
是否被覆盖object.ToString()
或IFormattable.ToString(string format, IFormatProvider formatProvider))
,因为您可以在这些情况下避免反思。
您可以使用GetMethod
的重载来获取Type[] types
参数,以选择所需的ToString
重载。
例如,您可以使用GetMethod("ToString",new Type[]{})
获取无参数ToString()
。
答案 6 :(得分:0)
检查是否要覆盖ToString()
,确实使用override
关键字:
class MyType
{
public override string ToString()
{
return "Whatever";
}
}
否则你隐藏了object.ToString()版本,而不是真正重写。
答案 7 :(得分:0)
在诸如此类的场景中,当您知道该方法存在时(可能会出现一些过载使问题复杂化),使用Reflection helper library为您做出艰苦的工作会很有帮助。
例如,Fasterflect允许您简单地执行以下操作,以便在给定提供的参数的情况下使用“最佳可用匹配”调用方法(在下面的示例中,可选参数42表示您要在使用时使用的某个值调用方法):
var obj = ...
var result = obj.TryCallMethodWithValues( "ToString", 42 );
根据我的经验,使用经过良好测试的库而不是手工编码(在这种情况下,反射)会相当快地得到回报。
免责声明:我是Fasterflect项目的贡献者。