Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#泛型方法,使用参数创建控件_C#_.net_Winforms_Generics - Fatal编程技术网

C#泛型方法,使用参数创建控件

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

我想知道是否可以通过以匿名类型传递控件的参数来创建控件(Winform)

例如

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 });