2013-03-08 7 views
6

Mi sono chiesto per un po 'di tempo - in C# c'è un modo per definire un "modello" per diverse proprietà all'interno di una classe. Ecco cosa voglio dire: Supponiamo che io ho la seguente classeC# implementa proprietà simili all'interno di una classe utilizzando un "modello"

class MyCLass 
{ 
    public int IntVal1 { get {...}; set{...} } 
    public byte IntVal2 { get {...}; set{...} } 
    .... 
    public long IntValN { get {...}; set{...} } 
} 

Non ho scritto qualsiasi implementazione specifica i metodi di accesso get e set, ma l'idea è che tutte queste proprietà hanno implementazioni molto simili - la differenza può sia che operano su diversi membri della classe che hanno diversi tipi, ma nel complesso sembrano tutti uguali.

La mia idea è di trovare un modo per definire una sorta di "template" (chiamiamolo) con alcuni parametri che probabilmente possono essere usati per dichiarare tutte queste proprietà senza la necessità di scrivere l'effettiva implementazione di ciascuna di esse di loro - magari usando attributi!?!

Immagino che quello di cui ho bisogno è simile a una macro C.

10x in anticipo

+0

10 x che anticipo? – Joe

+2

E '... baci? \ * smooches \ * –

+0

10x come in Grazie – user360607

risposta

1

Sì, se ho capito bene, in C# Generics usiamo per questo:

class MyCLass<T> 
{ 
    public T Val { get {...}; set{...} } 
} 

T definisce il tipo che si desidera "modello".

E quindi si utilizza la classe in questo modo:

var myClassInt = new MyClass<int>(); 
myClassInt.Val // is an integer 
+0

Per quanto ho capito, vuole "modellare" l'implementazione, non le definizioni del tipo. –

+0

@LuisFilipe "la differenza potrebbe essere che operano su diversi membri della classe che hanno diversi tipi, ma nel complesso sembrano tutti uguali." - Non sono sicuro se questo significhi generici o meno. –

+0

Aspettiamo e vediamo ... –

1

Si può avere uno sguardo al T4 templates e il codice che genera da esso: http://msdn.microsoft.com/en-us/library/vstudio/bb126445.aspx

Se si utilizzano le classi parziali è possibile utilizzare uno per il generata codice e l'altro per il codice non generato.

Ecco un bel tutorial su di esso: http://t4-editor.tangible-engineering.com/How-Do-I-With-T4-Editor-Text-Templates.html

+0

Dovremo esaminare gli articoli in dettaglio, ma la mia comprensione iniziale è che quei modelli T4 possono essere usati per creare automaticamente il codice necessario (basato su un modello predefinito). Ciò che volevo dire era se esiste un supporto in C# stesso per la costruzione di proprietà (nel mio caso) con un'implementazione simile definendo un "modello" comune e "collegandolo" a ciascuna di queste proprietà. – user360607

+1

Un modello T4 può definire il "modello" comune ed essere eseguito su qualsiasi tipo di file di configurazione che può quindi essere la parte "di collegamento". È il modo in cui Entity Framework genera il codice necessario in base a determinate configurazioni per le classi. T4 è il modo consigliato di creare codice/eseguire i lavori di macro e si trova in molte tecnologie/framework. Forse se potessi fornire dettagli più specifici sul tipo di implementazione della proprietà che vuoi raggiungere? – Cornelius

3

La risposta sarebbe "no", ma ci sono cose che si possono fare per ridurre la ripetizione. Ad esempio, si consideri:

private bool SetField<T>(ref T field, T value, 
    [CallerMemberName] string memberName = null) 
{ 
    if (!EqualityComparer<T>.Default.Equals(field, value)) 
    { 
     field = value; 
     var handler = PropertyChanged; 
     if (handler != null) handler(this, 
      new PropertyChangedEventArgs(memberName)); 
     return true; 
    } 
    return false; 
} 

che può essere utilizzato per ridurre il sovraccarico da qualcosa come:

private string bar; 
public string Bar 
{ 
    get { return bar; } 
    set { SetField(ref bar, value); } 
} 
+0

Sì, questo è quello che ho finito con. Ho pensato di controllare le alternative. – user360607

0

avete bisogno di un metodi virtuali protetti nella classe base. Questo metodo imposterà proprietà. In una classe figlia è possibile ereditare un'implementazione di base o sovrascrivere i metodi Init/Set/Get e realizzare un'implementazione personalizzata.

abstract class BaseMyClass 
{ 
    public BaseMyClass(arg1, arg2,...) 
    { 
     Init(arg1, arg2,...); 
    } 

    public int IntVal1 { get {...}; set{...} } 
    public byte IntVal2 { get {...}; set{...} } 
    public byte IntVal3 
    { 
     get 
     { 
      return GetIntVal3(); 
     } 
     set 
     { 
      SetIntVal3(value); 
     } 
    } 

    protected void virtual Init(arg1, arg2,...) 
    { 
     //Init properties 
    } 

    protected virtual byte GetIntVal3() 
    { 
     //Implementation 
    } 

    protected virtual void SetIntVal3(value) 
    { 
     //Implementation 
    } 
} 

class MyCLass : BaseMyClass 
{ 
    public MyCLass(arg1, arg2, ...): base(arg1, arg2,...) 
} 

class AnotherMyCLass : BaseMyClass 
{ 
    public MyCLass(arg1, arg2, ...): base(arg1, arg2,...) 

    protected override void Init(arg1, arg2,...) 
    { 
     //Init properties 
    } 
} 
Problemi correlati