C#泛型方法,使用参数创建控件
我想知道是否可以通过以匿名类型传递控件的参数来创建控件(Winform) 例如C#泛型方法,使用参数创建控件,c#,.net,winforms,generics,C#,.net,Winforms,Generics,我想知道是否可以通过以匿名类型传递控件的参数来创建控件(Winform) 例如 Create(新建{Text=“Test”}); 公共void创建(对象参数),其中T:Control { T控制=新的T(args); 返回控制; } 您可以通过传入一个动作委托来完成,如下所示: Create<Label>(label => label.Text = "Test"); public T Create<T>(Action<T> setup) wh
Create(新建{Text=“Test”});
公共void创建(对象参数),其中T:Control
{
T控制=新的T(args);
返回控制;
}
您可以通过传入一个动作委托来完成,如下所示:
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.Text=“Test”);
公共T创建(操作设置)
其中T:Control,new()
{
T控制=新的T();
设置(控制);
返回控制;
}
如果您有多个属性,则语法为:
Create<Label>(label => {
label.Text = "Test";
label.Color = Colors.Black;
});
Create(标签=>{
label.Text=“测试”;
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;
}
Create(label=>label.Text=“Test”,label=>label.Color=Colors.Black);
公共T创建(参数操作[]操作)
其中T:Control,new()
{
T控制=新的T();
如果(操作!=null)
foreach(行动中的var行动)
行动(控制);
返回控制;
}
您可以使用反射
,控件类只有一个无参数构造函数。因此您需要分别设置每个属性
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;
}
public T创建(对象参数),其中T:Control,new()
{
T控制=新的T();
var propertyValues=args.GetType()
.GetProperties()
.ToDictionary(x=>x.Name,x=>x.GetValue(args));
var controlType=类型(控制);
foreach(属性值中的var kvp)
{
var prop=controlType.GetProperty(kvp.Key);
属性设置值(控制,kvp值);
}
返回控制;
}
用法:
Label lbl = Create<Label>(new { Text = "bla bla bla..", BackColor = Color.Blue });
Label lbl=Create(新的{Text=“bla bla..”,BackColor=Color.Blue});
您的代码有一些问题:Function返回void
而不是T
或Control
,然后返回setup
而不是Control
。谢谢@Selman22,我认为Control
约束就足够了,但是你是对的。这与显而易见的、干净的新标签{Text=“Test”}
Label lbl = Create<Label>(new { Text = "bla bla bla..", BackColor = Color.Blue });