2010-07-29 31 views
15

Esiste un modo per creare un metodo generico che utilizza il vincolo di costruttore new() per richiedere classi con costruttori di tipi specifici?Metodi generici C#, parametri di tipo nel vincolo costruttore new()

Per esempio:

Ho il seguente codice:

public T MyGenericMethod<T>(MyClass c) where T : class 
{ 
    if (typeof(T).GetConstructor(new Type[] { typeof(MyClass) }) == null) 
    { 
     throw new ArgumentException("Invalid class supplied"); 
    } 
    // ... 
} 

E 'possibile avere qualcosa di simile, invece?

public T MyGenericMethod<T>(MyClass c) where T : new(MyClass) 
{ 
    // ... 
} 

EDIT: C'è a suggestion riguardo a questa. Si prega di votare così possiamo avere questa funzionalità in C#!

+1

Sono un po 'confuso. Che cosa stai cercando di realizzare esattamente. Il costruttore prende un parametro di MyClass o limita T a MyClass? –

risposta

28

Non proprio; C# supporta solo i vincoli del costruttore no-args.

La soluzione che uso per i costruttori arg generici è specificare il costruttore come delegato:

public T MyGenericMethod<T>(MyClass c, Func<MyClass, T> ctor) { 
    // ... 
    T newTObj = ctor(c); 
    // ... 
} 

poi al momento della chiamata:

MyClass c = new MyClass(); 
MyGenericMethod<OtherClass>(c, co => new OtherClass(co)); 
4

No. Purtroppo, vincoli generici solo permetterà di includere :

where T : new() 

Che specifica che c'è un cono di default, senza parametri structor. Non c'è modo di vincolare a un tipo con un costruttore che accetta un tipo di parametro specifico.

Per dettagli, vedere Constraints on Type Parameters.

+0

Sì, ho letto quell'articolo, ma non era molto specifico sul nuovo() vincolo. Grazie comunque, lascerò la mia convalida proprio dove è ... – Meryovi

+0

@Joel: L'opzione che mostrano è l'UNICA opzione per il nuovo vincolo(). Non c'è modo di aggiungere parametri. –

2

No, non è possibile in C# vincolare il tipo generico per avere un costruttore di una firma specifica. Solo il costruttore senza parametri è supportato da new().

+1

Sarebbe comunque una bella aggiunta! – Meryovi