使用反射获取String.Trim的MethodInfo?

时间:2014-12-17 04:24:08

标签: c# string reflection methodinfo

我可以得到MethodInfo String.Trim,如下所示,没关系,但得到的方法信息没有字符串参数!可以吗?

typeof(string).GetMethod("Trim", new Type[ ] {});

以下代码返回null,为什么?:

typeof(string).GetMethod("Trim", BindingFlags.Public);

我们如何使用(调用)Trim方法信息?

2 个答案:

答案 0 :(得分:2)

执行typeof(string).GetMethod("Trim", new Type[ ] {});时,您要求检索不带任何参数的方法的重载。这就是为什么输出中没有显示参数的原因。如果你执行此操作typeof(string).GetMethod("Trim", new Type[ ] {typeof(char[])});,它将返回相应的重载。

关于第二个问题,您可以通过设置指示实例方法的标志即BindingFlags.Public|BindingFlags.Instance来克服此问题。但是,这只会将错误更改为模糊匹配问题。我建议你传递参数类型列表以克服它。

答案 1 :(得分:2)

因为在你的第一个例子中,你特别要求一个没有参数的方法,你得到没有任何参数的重载。

如果你想要带参数的重载,你需要这样说:

typeof(string).GetMethod("Trim", new [] { typeof(char[]) });

要通过MethodInfo调用实例方法,您需要将实例引用传递给Invoke()方法:

// Parameterless overload
methodInfo.Invoke(myStringInstance, null);

// Single-parameter overload
methodInfo.Invoke(myStringInstance, new [] { new [] { ' ', '\r', '\n' } });

在您的第二个示例中,您既未指定BindingFlags.Instance也未指定BindingFlags.Static,因此(如文档所述)返回的方法为null。指定一个或另一个(BindingFlags.Instance方法的Trim())以获得有效的返回值(假设只有一个方法匹配...在这种情况下,有多个方法,所以你&#l; ll得到一个错误)。