メソッド(またはデリゲート)が値を返す場合、それは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;
}
}