【问题标题】:Cannot assign to 'textBoxSettingsMethod' because it is a 'method group'无法分配给“textBoxSettingsMethod”,因为它是“方法组”
【发布时间】:2012-12-25 04:12:02
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

    如果一个方法(或委托)返回一个值,它将是一个Func&lt;return_type&gt;,而不是一个动作。如果它有输入参数(参数),那么它将是一个Func&lt;arg1,arg2,arg3,return_type&gt;

    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&lt;string, TextBoxSettings&gt; 指定一个接受字符串参数(输入)并返回TextBoxSettings(输出)的方法。

    此外,由于您需要在TextBoxSettingsMethod 中输入参数,因此它不能是属性。我把它改成了一个方法。

    我还更改了测试以确保textBoxSettingsMethod 不为空(不是在执行时返回结果)。测试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;
        }
    }
    

    【讨论】:

    • 本质上,我需要那个 txtBoxName 来确定我正在接收哪个文本框并根据名称返回不同的设置等。我不知道如何摆脱它不是一个动作和改变到一个函数。
    • 是的,但是在CreateTextBoxSettingsMethod(string txtBoxName) 中这个论点真的有必要吗?此方法是否根据 tb 名称返回不同的设置创建方法,这些设置创建方法是否再次需要此参数? textBoxSettingsMethod 应该是 Dictionary&lt;string,Func&lt;string, TextBoxSettings&gt;&gt; 还是只是 Dictionary&lt;string,Func&lt;TextBoxSettings&gt;&gt;
    • 这里特别有必要,因为我将有一个 switch 语句返回每个文本框类型/名称的不同设置。我需要那个 tb 名称才能进入那个特定的 CreateTextBoxSettingsMethod。关于我如何尝试完成这项工作,我是否有意义?
    • +1 现在直到我让它工作,非常感谢你的帮助,但即使你提供了很棒的样本,我也无法让它在我的场景中工作。
    【解决方案2】:

    您将textBoxSettingsMethod 声明为方法:

    static Action<TextBoxSettings> textBoxSettingsMethod(string txtBoxName);
    

    当您尝试将其定义为属性时:

    static Action<TextBoxSettings> textBoxSettingsMethod;
    

    虽然由于txtBoxName 未在CreateTextBoxSettingsMethod 中使用,但对于您实际尝试完成的操作有点令人困惑。

    【讨论】:

    • 是的,它令人困惑。 OP似乎有一个返回方法的方法。
    • 我正在尝试将一个动作分配给一个动作,但两个动作都需要有一个字符串类型的传入参数......
    • 主要区别在于:txtBoxName 将用于定义动作,还是将txtBoxName 评估_当动作运行时?
    猜你喜欢
    • 1970-01-01
    • 2014-11-27
    • 1970-01-01
    • 1970-01-01
    • 2013-11-15
    • 2017-02-16
    • 1970-01-01
    • 1970-01-01
    • 2018-04-18
    相关资源
    最近更新 更多