如何在运行时动态传递要应用于字符串的字符串方法。 离。
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')
,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)'的方法) - 所以我不确定如何继续
答案 0 :(得分:2)
看看Reflection。除了解析用户提供的文本外,您基本上可以使用它来实现您所描述的内容。
你在那里使用的smiple例子会有类似的东西,
var method = "ToLower()";
var methodInfo = typeof(String).GetMethod(method);
var string = "foo";
string.GetType().InvokeMember(....);
答案 1 :(得分: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();
}
}
在您拥有早期“字符串参数”的所有地方,请使用枚举更改它: