12

可能重复:
是否可以复制某个控件的所有属性?(C# 窗口窗体)

我必须创建一些类似于作为设计时创建的控件的控件。创建的控件应该具有与预定义控件相同的属性,或者换句话说,我想复制一个控件。是否有任何单行代码用于此目的?或者我必须通过一行代码设置每个属性?我现在做的是:

        ListContainer_Category3 = new FlowLayoutPanel();
        ListContainer_Category3.Location = ListContainer_Category1.Location;
        ListContainer_Category3.BackColor = ListContainer_Category1.BackColor;
        ListContainer_Category3.Size = ListContainer_Category1.Size;
        ListContainer_Category3.AutoScroll = ListContainer_Category1.AutoScroll;
4

1 回答 1

27

一般来说,您可以使用反射将对象的公共属性复制到新实例。

但是,在处理控件时,您需要谨慎。一些属性,如 WindowTarget 仅由框架基础结构使用;所以你需要过滤掉它们。

过滤工作完成后,您可以编写所需的单行代码:

Button button2 = button1.Clone();

这里有一些代码可以帮助您入门:

public static class ControlExtensions
{
    public static T Clone<T>(this T controlToClone) 
        where T : Control
    {
        PropertyInfo[] controlProperties = typeof(T).GetProperties(BindingFlags.Public | BindingFlags.Instance);

        T instance = Activator.CreateInstance<T>();

        foreach (PropertyInfo propInfo in controlProperties)
        {
            if (propInfo.CanWrite)
            {
                if(propInfo.Name != "WindowTarget")
                    propInfo.SetValue(instance, propInfo.GetValue(controlToClone, null), null);
            }
        }

        return instance;
    }
}

当然,您仍然需要调整命名、位置等。还可能处理包含的控件。

于 2012-04-22T10:47:51.977 回答