11

在 C# 中是否可以动态创建一个新函数来定义一个变量?

我知道

string getResult() {
    if (a)
        return "a";
    return "b";
}
String result = getResult();

是可能的,但我正在寻找类似的东西

String result = new string getResult() {
    if (a)
        return "a";
    return "b";
}

这可能吗?如果是这样,有人会演示吗?

编辑 这是可能的

编辑:最终 - 解决方案

这是我野蛮入侵的最终结果

Func<string> getResult = () =>
{
    switch (SC.Status)
    {
        case ServiceControllerStatus.Running:
            return "Running";
        case ServiceControllerStatus.Stopped:
            return "Stopped";
        case ServiceControllerStatus.Paused:
            return "Paused";
        case ServiceControllerStatus.StopPending:
            return "Stopping";
        case ServiceControllerStatus.StartPending:
            return "Starting";
        default:
            return "Status Changing";
    }
};

TrayIcon.Text = "Service Status - " + getResult();
4

5 回答 5

13

定义此类函数的一种方法:

Func<bool, string> getResult = ( a ) => {
    if (a)
        return "a";
    return "b";
}

然后,您可以调用:string foo = getResult( true );。作为委托,它可以在需要时被存储/传递和调用。

例子:

string Foo( Func<bool, string> resultGetter ){
    return resultGetter( false );
}

您还可以关闭范围内的变量:

bool a = true;

Func<string> getResult = () => {
    if (a)
        return "a";
    return "b";
}

string result = getResult();
于 2012-08-26T01:36:11.557 回答
2

您想使用内联 if 语句。

string result = a ? "a" : "b";
于 2012-08-26T01:35:39.550 回答
2

如果你真的想要内联,你可以为 type 创建一个扩展方法String

static class StringExtensions {
    public static string ExecuteFunc(
            this string str, 
            Func<string, string> func
        ) {
        return func(str);
    }
}

然后,当你想使用它时,你可以这样做:

string str = "foo";

string result = str.ExecuteFunc( s => {
        switch(s){
            case "a":
                return "A";
            default:
                return "B";
        }
    }
);
于 2012-08-26T05:03:16.510 回答
0

不确定a您的示例中变量的范围是什么,但假设它可以在范围内访问(就像在您的示例中一样):

Func<string> getResult = () =>
{
    return a ? "a" : "b";
}
于 2012-08-26T01:42:32.270 回答
0

根据您发布的解决方案,这是一种更好的方法。

更改您的 ServiceControllerStatus 枚举以添加 [Description] 属性:

public enum ServiceControllerStatus
{
    [Description("Running")]
    Running,
    // ... others
}

在新的静态类中添加以下扩展方法:

public static string ToDescription(this Enum value)
{
    var attributes = (DescriptionAttribute[])value.GetType().GetField(value.ToString()).GetCustomAttributes(typeof(DescriptionAttribute), false);
    return attributes.Length > 0 ? attributes[0].Description : value.ToString();
}

现在你可以简单地写:

TrayIcon.Text = "Service Status - " SC.Status.ToDescription();
于 2012-08-26T02:40:40.903 回答