2010-07-12 13 views
6

Mi piacerebbe creare una classe del seguente tipocome fare classi generiche nidificate (se questo è il nome appropriato) in csharp

public class EnumerableDisposer<IEnumerable<IDisposable>> 

Ma non mi permette di dichiarare in questo modo. Ho anche provato:

public class EnumerableDisposer<T> : IDisposable where T : IEnumerable<J> where J : IDisposable 

Ma il compilatore mi dice che il tipo/spazio dei nomi J non può essere trovato.

Che cosa devo fare per creare questo corso?

risposta

12

quello che devi fare:

public class EnumerableDisposer<T, J> : IDisposable 
    where T : IEnumerable<J> where J : IDisposable 
{ 
    // Implement... 

Purtroppo, al fine di avvolgere qualsiasi tipo interno (IEnumerable<J>, nel codice), la classe "wrapping" ha bisogno di avere il tipo di J definito nella definizione generica. Inoltre, per aggiungere il vincolo IEnumerable<J>, è necessario l'altro tipo T.

Detto questo, se si vuole evitare la doppia specifica del tipo generico, si può sempre rielaborare questo come segue:

public class EnumerableDisposer<T> : IDisposable 
    where T : IDisposable 
{ 
    public EnumerableDisposer(IEnumerable<T> enumerable) 
    { 
     // ... 

Questo ti costringe a costruirlo con una IEnumerable<T> dove T è IDisposable, con un singolo tipo generico. Poiché si sta effettivamente aggiungendo il vincolo IEnumerable<T> tramite il costruttore, questo funzionerà come l'opzione precedente. L'unico inconveniente è che è necessario avere il generico fatto in fase di costruzione, ma dato il nome, ho il sospetto che andrà bene ...

+0

Questi sembrano fare il trucco. Ringrazia tutti. – scott

5

è necessario definire J.

esempio

public class EnumerableDispose<T, J> : IDisposable 
    where T : IEnumerable<T> 
    where J : IDisposable 

migliore sarebbe:

public class EnumerableDispose<T> : IEnumerable<T>, IDisposable 
    where T : IDisposable 
{ 
    public EnumerableDispose(IEnumerable<T> source) 
    { 
     // TODO: implement 
    } 
} 
0

Si può fare questo con l'aggiunta di un ulteriore parametro di J Tipo:

public class EnumerableDisposer<T, J> : IDisposable 
    where T : IEnumerable<J> 
    where J : IDisposable 

Si noti che queste T e J parametri sono indipendente da qualsiasi parametro nella classe esterna, anche se hanno lo stesso nome

Problemi correlati