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

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

恩。

String S = "Hello World"; String Format = "ToUpper()"; String sFormat = s.Format; resulting in "HELLO WORLD" 

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

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

解决方案的关键要求您使用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(); } 

您可以使用reflection执行此操作,但代码变得难以阅读,并且类型安全性消失。

C#为传递可执行代码提供了更好的机制 – 即代理。

你可以这样做:

 void ShowConverted(string str, Func conv) { Console.WriteLine("{0} -- {1}", str, conv(str)); } Func strAction1 = (s) => s.ToUpper(); Func strAction2 = (s) => s.ToLower(); ShowConverted("Hello, world!", stringAction1); ShowConverted("Hello, world!", stringAction2); 

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

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

我可能搞砸了一点语法

为什么不直接使用方法本身。

 Func format = s = > s.ToUpper(); 

然后你就可以做到

 format = s = > s.ToLower(); 

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

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

这样的东西可以工作,但我面前没有编译器来validation。

使用它像:

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