如何根据变量
的内容调用方法离。
String S = "Hello World";
String Format = "ToUpper()";
String sFormat = s.Format;
resulting in "HELLO WORLD"
这样我可以在其他时间通过Format = "ToLower()"
或Format =“删除(1,4)”这将删除从pos 1开始的4个字符 - 简而言之我希望能够调用任何字符串方法
有人可以发布完整的解决方案。
答案 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);
}
}