1

如何根据变量的内容调用方法

前任。

String S = "Hello World";
String Format = "ToUpper()";

String sFormat = s.Format;

resulting in "HELLO WORLD"

这样我可以在其他时间通过Format = "ToLower()"或 Format = "Remove(1,4)" 删除从 pos 1 开始的 4 个字符 - 简而言之,我希望能够调用任何字符串方法。

有人可以发布一个完整的工作解决方案。

4

6 回答 6

1

解决方案的症结需要你使用反射来定位所需的方法。这是一个涵盖您的情况的简单示例;

private string DoFormat(string data, string format)
{
    MethodInfo mi = typeof (string).GetMethod(format, new Type[0]);
    if (null == mi)
        throw new Exception(String.Format("Could not find method with name '{0}'", format));

    return mi.Invoke(data, null).ToString();
}

您可以使该方法更通用,以接受您要调用的方法的参数,如下所示。请注意调用 .GetMethod 和 .Invoke 以传递所需参数的方式的变化。

private static string DoFormat(string data, string format, object[] parameters)
{
    Type[] parameterTypes = (from p in parameters select p.GetType()).ToArray();

    MethodInfo mi = typeof(string).GetMethod(format, parameterTypes);
    if (null == mi)
        throw new Exception(String.Format("Could not find method with name '{0}'", format));

    return mi.Invoke(data, parameters).ToString();
}
于 2012-07-24T02:54:55.823 回答
1

您可以通过反射来做到这一点,但是代码变得难以阅读,并且类型安全性消失了。

C# 提供了一种更好的机制来传递可执行代码 - 即委托。

你可以这样做:

void ShowConverted(string str, Func<string,string> conv) {
    Console.WriteLine("{0} -- {1}", str, conv(str));
}

Func<string,string> strAction1 = (s) => s.ToUpper();
Func<string,string> strAction2 = (s) => s.ToLower();
ShowConverted("Hello, world!", stringAction1);
ShowConverted("Hello, world!", stringAction2);
于 2012-07-24T02:56:54.577 回答
1

您可以使用反射从字符串类型中提取 ToLower() 方法。

  string format = "Hello World";
  MethodInfo methodInfo = typeof(string).GetMethod("ToLower");
  string result = methodInfo.Invoke(format,null);

我可能把语法弄乱了一点

于 2012-07-24T02:57:20.533 回答
0

为什么不直接使用这些方法。

Func<string, string> format = s = > s.ToUpper();

然后你可以做

format = s = > s.ToLower();

否则,您将不得不使用反射,这不安全并且可能更慢。

于 2012-07-24T02:54:36.030 回答
0

你可以在这里使用反射。看看MethodInfo课堂。

于 2012-07-24T02:55:30.413 回答
0

像这样的东西会起作用,但我面前没有编译器来验证。

像这样使用它:

var result = someObject.CallParameterlessMethod("ToUpper");




public static class ObjectExtensionMethods
{
  public static object CallParameterlessMethod(this object obj, string methodName)
  {
    var method = typeof(obj).GetMethod(methodName);
    return method.Invoke(obj,null);
  }
}
于 2012-07-24T02:56:33.657 回答