Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xcode/7.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#,如何在运行时动态传递要应用于字符串的字符串方法。 前 当我们传递String S1=“S1111tring Manipulation”和format=Remove(1,4)-在幕后它变成S1。Remove(1,4)导致“字符串操纵” 或者,如果我们在场景后面传递String S1=“S1111tring操纵”和format=ToLower(),它将变为S1.ToLower(),从而导致“S1111tring操纵” 我应该能够通过任何有效的方法,如PadLeft(25,'0'),PadRight,

如何在运行时动态传递要应用于字符串的字符串方法。 前

当我们传递
String S1=“S1111tring Manipulation”
format=Remove(1,4)
-在幕后它变成
S1。Remove(1,4)
导致“字符串操纵”

或者,如果我们在场景后面传递
String S1=“S1111tring操纵”
format=ToLower()
,它将变为
S1.ToLower()
,从而导致
“S1111tring操纵”

我应该能够通过任何有效的方法,如
PadLeft(25,'0')
PadRight
Replace

请给我一个完整的例子

这是我尝试过的,但它不起作用

using System.Reflection;
string MainString = "S1111tring Manipulation";
string strFormat = "Remove(1, 4)";
string result = DoFormat(MainString, strFormat);

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();
        } 
抛出一个错误(找不到名为“Remove(1,4)”的方法)-因此我不确定如何继续

请查看。基本上,您可以使用它来实现所描述的内容,而不是解析用户提供的文本

您在这里使用的smiple示例如下:

var method = "ToLower()";
var methodInfo = typeof(String).GetMethod(method);
var string = "foo";
string.GetType().InvokeMember(....);

考虑使用枚举而不是第二个字符串参数。这将有助于类型安全

public enum StringManipulationType
{
  ToLower,
  ToUpper
}
然后用以下方法重写您的操作方法:

private string Formatting(String data, StringManipulationType manipulationType)
{
  switch (manipulationType)
  {
    case StringManipulationType.ToLower:
      return data.ToLower();
    case StringManipulationType.ToUpper:
      return data.ToUpper();
    case default:
      throw new ArgumentException();
  }
}

在所有使用前面的“字符串参数”的地方,使用enum将其更改如下:

我没搞错,您是否正在考虑将函数名传递给函数?您可以将前面问题的任何答案标记为正确,或者改进这个问题,而不是问一个意义相同的全新问题。你试过什么?“在运行时应用”是什么意思?这是非常模糊的。一切最终都是在运行时完成的。看起来你想把一个字符串和一个方法传递给另一个方法,是吗?在方法中创建一个switch语句,并匹配format参数的值,然后执行相应的方法。如果OP知道方法的类型——如果他们要定义一个枚举,那么他们会知道的——为什么不直接使用Func并传入呢?此外,这并没有准确地涵盖他们需要方法参数的情况。J.Steen-我仍然没有一个答案或代码可以用于我的情况。@wadapav,在前面的问题中,你也没有说明你尝试了什么。我们确实希望在这里付出一些努力。=)J.Steen-感谢您的帮助-请参见上文我将如何实现Remove(1,4)@wadapav您可以使用regex删除参数,然后通过反射将参数作为对象数组传递。但是,很难判断将类型转换为什么类型,因此您将失去所有编译时安全性。你为什么要这么做?@James正如James所说,你需要使用正则表达式来解析字符串并构造你想要的东西。解析出方法名、参数数组和一些可以推断出所解析内容类型的内容。如果您希望为完全自由的文本执行此操作,那么需要做大量的工作。我需要让用户能够决定需要对字符串执行哪些操作。我可以想象写案例陈述
private string Formatting(String data, StringManipulationType manipulationType)
{
  switch (manipulationType)
  {
    case StringManipulationType.ToLower:
      return data.ToLower();
    case StringManipulationType.ToUpper:
      return data.ToUpper();
    case default:
      throw new ArgumentException();
  }
}