通过反射调用“ToString”方法

时间:2011-10-27 13:30:48

标签: c#

我正在尝试按如下方式检索MethodInfo“ToString”:

MethodInfo method = MyType.GetMethod("ToString", 
                                     BindingFlags.Public | BindingFlags.Instance);

异常被抛出“发现模糊匹配”。

8 个答案:

答案 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项目的贡献者。