如果方法(或委託)返回一個值,它將是一個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
不爲空(不執行結果返回時執行它)。測試textBoxSettingsMethod(txtBoxName) == null
調用該方法並測試TextBoxSettings
類型的返回值是否爲null
。如果您只想知道方法是否已定義,則測試應爲textBoxSettingsMethod == null
。
不要混淆表達textBoxSettingsMethod
其是其中執行的方法中的方法(或代表)和textBoxSettingsMethod(txtBoxName)
。
string txtBoxName
是什麼意思?你沒有使用它。你對不同的文本框需要不同的方法嗎?這很難說。
UPDATE
這總是創建返回取決於文本名稱不同的設置相同的方法(不需要參數string txtBoxName
,僅lambda表達式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 };
}
};
}
在相反,這是一個創建返回alwas相同的設置方法不同的方法
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;
}
}
本質上,我需要txtBoxName爲了確定我接收哪個文本框,並返回每個名稱的不同設置等。我不明白我是如何擺脫它不是一個行動,並改變爲一個FUNC。 –
是的,但是'CreateTextBoxSettingsMethod(string txtBoxName)'這個參數是否真的有必要?此方法是否根據tb名稱返回不同的設置創建方法,並且這些設置創建方法是否需要再次使用此參數? 'textBoxSettingsMethod'可能是'Dictionary>'還是'Dictionary >'? –
這是必要的,因爲我將有一個switch語句返回不同的設置每種類型/文本框的名稱。我需要該tb名稱才能進入特定的CreateTextBoxSettingsMethod。我對我如何嘗試做這項工作有意義嗎? –