我想知道是否可以通過將控件的參數作爲匿名類型傳遞來創建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;
}
我想知道是否可以通過將控件的參數作爲匿名類型傳遞來創建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;
}
你可以通過傳遞一個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;
}
沒有'新''約束不會工作 –
您的代碼有一些問題:f untion返回'void'而不是'T'或'Control',然後返回'setup'而不是'control'。 –
謝謝@ Selman22,我認爲'Control'約束就足夠了,但你是對的。 – McGarnagle
您可以使用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 });
這是沒有改進了顯而易見的乾淨'新標籤{文字=「測試」}' –