2012-07-24 41 views
1

如何根据变量的内容调用方法基于变量内容的c#调用方法

ex。

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

String sFormat = s.Format; 

resulting in "HELLO WORLD" 

这样我可以在其他时间通过Format = "ToLower()"或格式=“删除(1,4)”,这将删除4个字符从位置1开始 - 在短我想调用任何字符串的方法的能力。

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

+0

你可以与反思这样做很容易...但它不完全是码最快位写过。 – asawyer 2012-07-24 02:52:33

+0

看到这个答案: http://stackoverflow.com/questions/4629/how-can-i-read-the-properties-of-a-c-sharp-class-dynamically – David 2012-07-24 02:57:38

+1

真正的问题是;这是解决你的问题的最好方法吗? – 2012-07-24 03:01:55

回答

1

解决方案的症结要求您使用Reflection来定位所需的方法。这是一个简单的例子,涵盖你的sitaution;

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

您的解决方案适用于ToUpper或ToLower,但如何通过替换(1,4) – wadapav 2012-07-24 14:58:00

+0

请参阅上面的编辑。您需要调用GetMethod和Invoke的不同重载以将参数传递给“DoFormat”方法。 – 2012-07-24 21:59:38

0

为什么不只是使用方法本身。

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

,然后你可以做

format = s = > s.ToLower(); 

否则你不得不去思考,这是不是安全,可能更慢。

+0

如果要使用的方法是外部指定的(例如,在配置文件中),则仍然需要某种方法将方法名称转换为方法。 – 2012-07-24 02:55:41

+0

@RJLohan如果他不得不使用字符串,我仍然会使用枚举来选择正确的方法。 – 2012-07-24 02:57:24

0

您可以在这里使用Reflection。看看MethodInfo课程。

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

您可以使用反射来从字符串类型拉ToLower将()方法。

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

我可能搞砸的语法有点