C#Generic Method,使用参数创建控件

时间:2014-04-25 20:11:18

标签: c# .net winforms generics

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

E.G

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

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

2 个答案:

答案 0 :(得分: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;
}

答案 1 :(得分:0)

你可以使用Reflection,Control类只有一个无参数的构造函数。所以你需要单独设置每个属性

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