如何将函数视为字符串?

时间:2013-11-26 16:33:29

标签: c#

我想问一下是否可以将函数调用为ToUpperToLower()作为字符串,例如f.Name.Replace(" ", "_").ToLower()".ToLower()""ToUpper",例如,如果用户选择将文件名转换为ToLower()来自下拉列表。它将取值'ToLower'并添加到函数中并执行函数调用

8 个答案:

答案 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()");

当然这只是它如何评估字符串中的内容的一个例子,因为你可以看到你只需要传递一个“上下文”,其中表达式意味着什么,在这种情况下是当前的类( “这”)。