2014-04-25 52 views
2

我想知道是否可以通過將控件的參數作爲匿名類型傳遞來創建Control(Winform)。C#通用方法,使用參數創建控件

EG

Create<Label>(new {Text = "Test"}); 

public void Create<T>(object args) where T : Control 
{ 
    T Control = new T(args); 
    return Control; 
} 
+4

這是沒有改進了顯而易見的乾淨'新標籤{文字=「測試」}' –

回答

3

你可以通過傳遞一個Action委託,像這樣做:

Create<Label>(label => label.Text = "Test"); 

public T Create<T>(Action<T> setup) 
    where T : Control, new() 
{ 
    T control = new T(); 
    setup(control); 
    return control; 
} 

如果你有多個屬性,語法是:

Create<Label>(label => { 
    label.Text = "Test"; 
    label.Color = Colors.Black; 
}); 

或者,你可以有多個參數:

Create<Label>(label => label.Text = "Test", label => label.Color = Colors.Black); 

public T Create<T>(params Action<T>[] actions) 
    where T : Control, new() 
{ 
    T control = new T(); 
    if (actions != null) 
     foreach (var action in actions) 
      action(control); 
    return control; 
} 
+0

沒有'新''約束不會工作 –

+0

您的代碼有一些問題:f untion返回'void'而不是'T'或'Control',然後返回'setup'而不是'control'。 –

+0

謝謝@ Selman22,我認爲'Control'約束就足夠了,但你是對的。 – McGarnagle

0

您可以使用Reflection,控制類只有一個無參數constructor.So你需要設置每個屬性分別

public T Create<T>(object args) where T : Control, new() 
{ 
     T control = new T(); 
     var propertyValues = args.GetType() 
      .GetProperties() 
      .ToDictionary(x => x.Name, x => x.GetValue(args)); 
     var controlType = typeof(Control); 
     foreach (var kvp in propertyValues) 
     { 
      var prop = controlType.GetProperty(kvp.Key); 
      prop.SetValue(control, kvp.Value); 
     } 
     return control; 
} 

用法:

Label lbl = Create<Label>(new { Text = "bla bla bla..", BackColor = Color.Blue });