1

このエラーに関して、Web上の約20ページ以上を確認しました。私はこれに対する解決策を見つけることができませんでした。エラーが発生している理由はわかっていますが、これを修正する方法がわかりません。:

アクションにアクションを割り当てる必要がありますが、これらのアクションには文字列型の着信パラメーターが必要です。私はかなり長い間これに苦労してきたので、どんなアイデアも大歓迎です。

public class CommonDemoHelper
{
    static Action<TextBoxSettings> textBoxSettingsMethod(string txtBoxName);
    static Action<DateEditSettings> dateEditSettingsMethod;
    static Action<LabelSettings> labelSettingsMethod;
    static Action<LabelSettings> wideLabelSettingsMethod;
    static Action<SpinEditSettings> spinEditSettingsMethod;
    static Action<MemoSettings> memoSettingsMethod;

    public static Action<TextBoxSettings> TextBoxSettingsMethod(string txtBoxName)
    {
        get
        {

            if (textBoxSettingsMethod(txtBoxName) == null)
                //Getting error below cannot assign to method group
                textBoxSettingsMethod = CreateTextBoxSettingsMethod(txtBoxName);
            return textBoxSettingsMethod(txtBoxName);
        }
    }

    static Action<TextBoxSettings> CreateTextBoxSettingsMethod(string txtBoxName)
    {
        return settings =>
        {
            settings.ControlStyle.CssClass = "editor";
            settings.ShowModelErrors = true;
            settings.Properties.ValidationSettings.ErrorDisplayMode = ErrorDisplayMode.ImageWithText;
        };
    }
}
4

2 に答える 2

2

あなたはtextBoxSettingsMethodメソッドとして宣言しています:

static Action<TextBoxSettings> textBoxSettingsMethod(string txtBoxName);

プロパティとして定義しようとしているように見える場合:

static Action<TextBoxSettings> textBoxSettingsMethod;

txtBoxNameで使用されていないのでCreateTextBoxSettingsMethod、実際に何を達成しようとしているのかについて少し混乱しています。

于 2013-01-10T17:27:56.000 に答える
2

メソッド(またはデリゲート)が値を返す場合、それはFunc<return_type>アクションではなく、になります。入力パラメータ(引数)がある場合は、Func<arg1,arg2,arg3,return_type>

static Func<string, TextBoxSettings> textBoxSettingsMethod;

public static Func<string, TextBoxSettings> GetTextBoxSettingsMethod(string txtBoxName)
{
    if (textBoxSettingsMethod == null)
        textBoxSettingsMethod = CreateTextBoxSettingsMethod(txtBoxName);
    return textBoxSettingsMethod;
}

static Func<string, TextBoxSettings> CreateTextBoxSettingsMethod(string txtBoxName)
{
    ...
}

ここFunc<string, TextBoxSettings>では、文字列パラメータ(入力)を受け取り、(出力)を返すメソッドを指定しますTextBoxSettings

また、入力引数が必要なためTextBoxSettingsMethod、プロパティにすることはできません。メソッドに変更しました。

また、テストを変更して、それtextBoxSettingsMethodがnullでないことを確認しました(実行時に結果が返されません)。テストtextBoxSettingsMethod(txtBoxName) == nullはメソッドを呼び出し、型の戻り値がであるかどうかをテストしTextBoxSettingsますnull。メソッドが定義されているかどうかだけを知りたい場合は、テストを行う必要がありますtextBoxSettingsMethod == null

メソッド(またはデリゲート)であり、メソッドを実行するtextBoxSettingsMethod式を混同しないでください。textBoxSettingsMethod(txtBoxName)


議論は何にstring txtBoxName適していますか?あなたはそれを使用していません。テキストボックスごとに異なるメソッドが必要ですか?言うのは難しいです。


アップデート

これにより、テキストボックス名に応じて異なる設定を返す同じメソッドが常に作成されます(引数は必須ではなく、呼び出されたときに実際のパラメーター値を必要とするstring txtBoxNameラムダ式の引数のみ)。tbName

static Func<string, TextBoxSettings> CreateTextBoxSettingsMethod()
{
    return tbName =>
    {
        TextBoxSettings settings;
        switch (tbName) {
            case "textbox1":
            case "textbox2":
            case "textbox3":
                settings = new TextBoxSettings {
                    TextBoxName = tbName,
                    ControlStyle = "editor",
                    ShowModelErrors = true
                };
                settings.Properties.ValidationSettings.ErrorDisplayMode = ErrorDisplayMode.ImageWithText;
                return settings;
            case "textbox4":
            case "textbox5":
                settings = new TextBoxSettings {
                    TextBoxName = tbName,
                    ControlStyle = "displayer",
                    ShowModelErrors = false
                };
                settings.Properties.ValidationSettings.ErrorDisplayMode = ErrorDisplayMode.TextOnly;
                return settings;
            default:
                return new TextBoxSettings { TextBoxName = tbName };
        }
    };
}

対照的に、これは常に同じ設定を返すさまざまなメソッドを作成するメソッドです

static Func<string, TextBoxSettings> CreateTextBoxSettingsMethod(string txtBoxName)
{
    switch (txtBoxName) {
        case "textbox1":
        case "textbox2":
        case "textbox3":
            return tbName =>
            {
                var settings = new TextBoxSettings {
                    TextBoxName = tbName,
                    ControlStyle = "editor",
                    ShowModelErrors = true
                };
                settings.Properties.ValidationSettings.ErrorDisplayMode = ErrorDisplayMode.ImageWithText;
                return settings;
            };
        case "textbox4":
        case "textbox5":
            return tbName =>
            {
                var settings = new TextBoxSettings {
                    TextBoxName = tbName,
                    ControlStyle = "displayer",
                    ShowModelErrors = false
                };
                settings.Properties.ValidationSettings.ErrorDisplayMode = ErrorDisplayMode.TextOnly;
                return settings;
            };
        default:
            return tbName => new TextBoxSettings { TextBoxName = tbName };
    }
}

更新#2

多分あなたはこれが欲しい

static Dictionary<string, Func<string, TextBoxSettings>> textBoxSettingsMethod
    = new Dictionary<string,Func<string,TextBoxSettings>>();

public static Func<string, TextBoxSettings> GetTextBoxSettingsMethod(string txtBoxName)
{
    Func<string, TextBoxSettings> method;
    if (!textBoxSettingsMethod.TryGetValue(txtBoxName, out method)) {
        method = CreateTextBoxSettingsMethod(txtBoxName);
        textBoxSettingsMethod.Add(txtBoxName, method);
    }
    return method;
}

次のように使用できます。

Func<string, TextBoxSettings> method;
TextBoxSettings setting;

method = GetTextBoxSettingsMethod("textbox1");
setting = method("textbox1");

// or

setting = GetTextBoxSettingsMethod("textbox1")("textbox1");

// or, if you are sure that all the methods have been assigned

method = textBoxSettingsMethod["textbox1"];
setting = method("textbox1");

// or

setting = textBoxSettingsMethod["textbox1"]("textbox1");

しかし、なぜこれらのメソッドを動的に作成したいのかはまだわかりません。設定を返す簡単な方法で十分です

public static TextBoxSettings GetTextBoxSettings(string txtBoxName)
{
    switch (txtBoxName) {
        // ...
        default:
            return null;
    }
}
于 2013-01-10T17:49:46.253 に答える