无法分配给'textBoxSettingsMethod',因为它是'方法组'

时间:2013-01-10 17:20:39

标签: c# asp.net-mvc-4 devexpress

我已经在网上查看了有关此错误的大约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;
        };
    }
}

2 个答案:

答案 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;
    }
}