2013-01-10 27 views
1

我已查看過有關此錯誤的網頁上有20多頁的網頁。我一直無法找到解決方案。我知道錯誤發生的原因,但無法弄清楚如何解決這個問題。 :無法指定爲'textBoxSettingsMethod',因爲它是'方法組'

我只需要爲我的動作分配一個動作,但這些動作必須有一個傳入的參數類型爲字符串。任何想法都非常感激,因爲我一直在爲此奮鬥了一段時間。

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

如果方法(或委託)返回一個值,它將是一個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; 
    } 
} 
+0

本質上,我需要txtBoxName爲了確定我接收哪個文本框,並返回每個名稱的不同設置等。我不明白我是如何擺脫它不是一個行動,並改變爲一個FUNC。 –

+0

是的,但是'CreateTextBoxSettingsMethod(string txtBoxName)'這個參數是否真的有必要?此方法是否根據tb名稱返回不同的設置創建方法,並且這些設置創建方法是否需要再次使用此參數? 'textBoxSettingsMethod'可能是'Dictionary >'還是'Dictionary >'? –

+0

這是必要的,因爲我將有一個switch語句返回不同的設置每種類型/文本框的名稱。我需要該tb名稱才能進入特定的CreateTextBoxSettingsMethod。我對我如何嘗試做這項工作有意義嗎? –

2

你聲明textBoxSettingsMethod的方法:

static Action<TextBoxSettings> textBoxSettingsMethod(string txtBoxName); 

時,它看起來像你試圖將其定義爲一個屬性:

static Action<TextBoxSettings> textBoxSettingsMethod; 

雖然自txtBoxName不在CreateTextBoxSettingsMethod中使用,對於你實際要完成的事情有點混淆。

+2

是的,它的混亂。 OP似乎有一個方法返回一個返回方法的方法。 –

+0

我正在嘗試爲一個動作分配一個動作,但是這兩個動作都需要有一個類型爲string的傳入參數.... –

+1

主要區別在於:將txtBoxName用於_define_動作,還是將'txtBoxName'在行動開始時進行評估? –

相關問題