c#基于变量内容的调用方法

时间:2012-07-24 02:50:29

标签: c#

如何根据变量

的内容调用方法

离。

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

String sFormat = s.Format;

resulting in "HELLO WORLD"

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

有人可以发布完整的解决方案。

6 个答案:

答案 0 :(得分:1)

解决方案的关键要求您使用Reflection来找到所需的方法。这是一个涵盖您的情况的简单示例;

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();
}

答案 1 :(得分: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);

答案 2 :(得分:1)

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

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

我可能搞砸了语法

答案 3 :(得分:0)

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

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

然后你可以做

format = s = > s.ToLower();

否则你必须使用Reflection,这不安全且可能更慢。

答案 4 :(得分:0)

你可以在这里使用Reflection。看一下MethodInfo课程。

答案 5 :(得分: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);
  }
}