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

このような関数を定義する 1 つの方法:

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

本当にインラインが必要な場合は、次のタイプの拡張メソッドを作成できます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 に答える
2

インライン if ステートメントを使用します。

string result = a ? "a" : "b";
于 2012-08-26T01:35:39.550 に答える
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 に答える
0

あなたの例では変数のスコープが何であるかはわかりませんが、aスコープ内でアクセスできると仮定します(例のように):

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