2012-04-22 18 views
7

Eventuali duplicati:
It is possible to copy all the properties of a certain control? (C# window forms)Controlli dei Cloni - C# (Winform)

devo creare alcuni controlli simili a un controllo creata come fase di progettazione. Il controllo creato dovrebbe avere le stesse proprietà di un controllo predefinito o, in altre parole, voglio copiare un controllo. C'è una singola riga di codice per questo scopo? o devo impostare ogni proprietà con una riga di codice? che sto facendo in questo momento è:

 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; 

risposta

17

In generale è possibile utilizzare la reflection per copiare le proprietà pubbliche di un oggetto a una nuova istanza.

Tuttavia, quando si ha a che fare con i controlli, è necessario essere prudenti. Alcune proprietà, come WindowTarget, sono pensate per essere utilizzate solo dall'infrastruttura del framework; quindi è necessario filtrarli.

Dopo il lavoro di filtraggio è fatto, è possibile scrivere il desiderato one-liner:

Button button2 = button1.Clone(); 

Ecco un po 'di codice per iniziare:

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

Naturalmente, è ancora necessario regolare denominazione, ubicazione, ecc. Forse anche gestire i controlli contenuti.