我已经在网上查看了有关此错误的大约20多页。我一直无法找到解决方案。我知道为什么错误发生但无法弄清楚如何解决这个问题。 :
我只需要为我的操作分配一个动作,但这些动作必须有一个string类型的传入参数。任何想法都非常感激,因为我一直在努力解决这个问题。
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;
};
}
}
答案 0 :(得分:2)
您宣布textBoxSettingsMethod
为方法:
static Action<TextBoxSettings> textBoxSettingsMethod(string txtBoxName);
当你试图将它定义为属性时:
static Action<TextBoxSettings> textBoxSettingsMethod;
虽然txtBoxName
中未使用CreateTextBoxSettingsMethod
,但实际上您要实现的目标有点令人困惑。
答案 1 :(得分: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
不是必需的,只有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 };
}
};
}
相比之下,这是一种创建不同方法的方法,这些方法返回相同的设置
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;
}
}