基于变量内容的c#调用方法
如何基于变量的内容调用方法 前 这样,我可以在其他时间传递基于变量内容的c#调用方法,c#,C#,如何基于变量的内容调用方法 前 这样,我可以在其他时间传递Format=“ToLower()”或Format=“Remove(1,4)”,它将删除从pos 1开始的4个字符-简而言之,我希望能够调用任何字符串方法 是否有人可以发布一个完整的工作解决方案。为什么不直接使用这些方法呢 Func<string, string> format = s = > s.ToUpper(); 否则,您将不得不使用反射,这是不安全的,而且速度可能较慢。解决方案的关键要求您使用反射来定位所需的方
Format=“ToLower()”
或Format=“Remove(1,4)”,它将删除从pos 1开始的4个字符-简而言之,我希望能够调用任何字符串方法
是否有人可以发布一个完整的工作解决方案。为什么不直接使用这些方法呢
Func<string, string> format = s = > s.ToUpper();
否则,您将不得不使用反射,这是不安全的,而且速度可能较慢。解决方案的关键要求您使用反射来定位所需的方法。这是一个简单的例子,涵盖了你的情况
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();
}
你可以利用这里的反射。看看
MethodInfo
类。类似的东西可以工作,但我面前没有要验证的编译器
像这样使用它:
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);
}
}
您可以通过反射来实现这一点,但是代码变得难以阅读,类型安全性也消失了 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);
void ShowConverted(字符串str,Func conv){
WriteLine(“{0}--{1}”,str,conv(str));
}
Func strAction1=(s)=>s.ToUpper();
Func strAction2=(s)=>s.ToLower();
ShowConverted(“你好,世界!”,stringAction1);
ShowConverted(“你好,世界!”,stringAction2);
您可以使用反射从字符串类型中提取ToLower()方法
string format = "Hello World";
MethodInfo methodInfo = typeof(string).GetMethod("ToLower");
string result = methodInfo.Invoke(format,null);
我可能把语法弄乱了一点你可以通过反射轻松做到这一点。。。但这并不是有史以来最快的一段代码;这是解决你的问题的最好方法吗?…以及它是如何(或在什么情况下)帮助你的?!嗨,欢迎来到SO!“发布一个完整的工作解决方案”并不是我们在这里的一般习惯,但我们很乐意帮助您,并给您一些提示。您是否有遇到特殊问题的示例或代码片段?如果要使用的方法是在外部指定的(例如,在配置文件中),您仍然需要某种方法将方法名称转换为方法。@RJLohan如果必须使用字符串,我仍然会使用枚举来选择正确的方法。您的解决方案对于ToUpper或ToLower很有效,但如何传递替换(1,4)请参见上面的编辑。您需要调用GetMethod的不同重载并调用以将参数传递给“DoFormat”方法。
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);
string format = "Hello World";
MethodInfo methodInfo = typeof(string).GetMethod("ToLower");
string result = methodInfo.Invoke(format,null);