-2

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

Private String Formatting(String Data, String Format)

当我们通过String S1 = "S1111tring Manipulation"并且format = Remove(1,4)- 在幕后它会S1.Remove(1,4)导致“字符串操作”

或者如果我们经过String S1 = "S1111tring Manipulation"并且format = ToLower()在幕后它会S1.ToLower()导致"s1111tring manipulation"

我应该能够传递任何有效的方法,如,PadLeft(25,'0')等...PadRightReplace

我会很感激一个完整的例子

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

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)”的方法) - 所以我不确定如何继续

4

2 回答 2

2

看看反射。除了解析用户提供的文本外,您基本上可以使用它来实现您所描述的内容。

您在那里使用的简单示例将类似于,

var method = "ToLower()";
var methodInfo = typeof(String).GetMethod(method);
var string = "foo";
string.GetType().InvokeMember(....);
于 2012-07-24T13:03:23.587 回答
0

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

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

在您拥有早期“字符串参数”的所有地方,使用枚举更改它,如下所示:

于 2012-07-24T13:10:15.517 回答