Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
基于变量内容的c#调用方法_C# - Fatal编程技术网

基于变量内容的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);