我想问一下是否可以将函数调用为ToUpper
或ToLower()
作为字符串,例如f.Name.Replace(" ", "_").ToLower()".ToLower()"
或"ToUpper"
,例如,如果用户选择将文件名转换为ToLower()来自下拉列表。它将取值'ToLower'并添加到函数中并执行函数调用
答案 0 :(得分:1)
conditional operator(?:
)可能是更好的选择
var fileName = f.Name.Replace(" ", "_");
fileName = ddl.SelectedValue == "ToLower" ? fileName.ToLower() : fileName.ToUpper();
将反射用于微不足道的事情是非常必要的。
答案 1 :(得分:1)
嗯,不干净。您可以使用反射来查找方法,但是您必须知道函数将应用的确切类型,因为您不会像在编译时那样获得复杂的绑定。另外,您将被限制为一个方法签名(在这种情况下,没有输入参数并返回一个字符串)。
要支持具有该签名的任何字符串函数,您可以使用:
string val = f.Name.Replace(" ", "_").ToLower();
string strCommand = "ToUpper";
MethodInfo theMethod = typeof(string).GetMethod(strCommand,new Type[] {});
string result = (string)(theMethod.Invoke(val,null));
但是简单的switch
似乎更清洁,更安全。
答案 2 :(得分:1)
您可以创建已定义的函数字典,您可以按操作的名称访问这些字典。你将摆脱任何条件陈述和所有反思。示例如下:
var actions = new Dictionary<string, Func<string, string>>()
{
//keys may have other, human-readable values
{"ToLower", s => s.ToLower()},
{"ToUpper", s => s.ToUpper()}
};
//you will receive this from drop down list, it's the name of the action
var userSelectedOption = "ToUpper";
//string that you want to process
var myString = "some other user input";
//selecting appropriate action and passing myString to it
var transformedString = actions[userSelectedOption](myString);
//prints "SOME OTHER USER INPUT"
Console.WriteLine(transformedString);
答案 3 :(得分:1)
如果你知道之前要调用的方法,你可以在字典中注册它们(key =函数的名称或用户友好的东西,value =执行转换的函数):
var dict = new Dictionary<string, Func<string, string>>();
dict.Add("Lowercase", x => x.ToLower());
dict.Add("Uppercase", x => x.ToUpper());
您可以将下拉列表绑定到字典(text = Key,value = Value)并按如下方式执行转换(ddl是DropDownList的名称):
var f = (Func<string, string>)ddl.SelectedValue;
var convStr = f(inputStr);
答案 4 :(得分:0)
使用反射,您可以使用字符串调用方法:
String ToLower = "ToLower";
String SometString = "This Is My String";
Type stringType = typeof(String);
// Get the overload of ToLower that takes no parameters
MethodInfo method = stringType.GetMethod(ToLower, System.Type.EmptyTypes);
// Invoke the method with no parameters
String newString = (String)method.Invoke(SometString, null);
MessageBox.Show(newString);
答案 5 :(得分:0)
如果我已正确理解您的问题,您希望根据字符串调用方法。
您可以使用反射,这本身就是一个主题,但为了让您入门,您可以执行以下操作:
MethodInfo chosenMethod = typeof(string).GetMethod(methodName, Types.EmptyTypes);
chosenMethod.Invoke(stringToModify, new object[]{});
但是如果它是一个非常有限的函数集,你应该只对用户输入做一个switch语句:
switch(methodName)
{
case "ToLower":
stringToModify.ToLower();
break;
...
答案 6 :(得分:0)
您可以使用简单的switch
声明:
switch (value) // Assuming value is of type SomeEnum
{
case SomeEnum.ToLower:
return f.ToLower()
case SomeEnum.ToUpper:
return f.ToUpper();
default:
//Do the Default
break;
}
这是解析从UI获得的内容的方法:
public static T ParseEnum<T>( string value )
{
return (T) Enum.Parse( typeof( T ), value, true );
}
答案 7 :(得分:0)
也许你可能需要避免限制是一种运行时解析器C#,就像JavaScript中的eval()
函数一样,实现起来并不容易也不容易,但有一个好处那里的图书馆叫做 C#Eval (http://csharp-eval.com/Download.php)当然在内部使用Reflection。它更重,但更有效,甚至更复杂的情节。
您可以以这种方式使用它,例如:
class Person
{
public string Name;
public string Process(string expression)
{
return CsEval.Eval(this, expression);
}
}
然后可以称之为:
var f = new Person();
f.Name = "John";
f.Name = f.Process("Name.Replace(" ", "_").ToLower()");
当然这只是它如何评估字符串中的内容的一个例子,因为你可以看到你只需要传递一个“上下文”,其中表达式意味着什么,在这种情况下是当前的类( “这”)。