12

重複の可能性:
特定のコントロールのすべてのプロパティをコピーすることは可能ですか?(C#ウィンドウフォーム)

デザイン時に作成されたコントロールと同様のコントロールをいくつか作成する必要があります。作成されたコントロールは、事前定義されたコントロールと同じプロパティを持つ必要があります。つまり、コントロールをコピーしたいと思います。その目的のためのコードは1行ありますか?または、コード行で各プロパティを設定する必要がありますか?私が今やっているのは:

        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 に答える