2012-02-28 16 views
7

Ho una classe che ho creato utilizzando CodeDOM:Come creare una classe generica usando CodeDOM il cui parametro generico è un tipo che ho creato?

CodeTypeDeclaration some_class = new CodeTypeDeclaration("SomeClass"); 
// ... properties and methods creation elided 

voglio creare una lista di tipo "SomeClass". Tuttavia, non riesco a farlo:

var list_type = new CodeTypeReference(typeof (List<>).Name, ??? some_class ???); 
var member_field = new CodeMemberField(list_type, field_name) 
             { 
               Attributes = MemberAttributes.Private, 
             }; 

CodeTypeReference non accetta una CodeTypeDeclaration, che è quello che mi serve. Cosa posso fare? I non desidera passare il nome della classe come stringa, poiché ciò potrebbe causare errori.

+0

Come sarebbe passando la proprietà Name della dichiarazione del tipo essere qualsiasi d ifferent dall'usare la proprietà name di typeof (Lista <>)? – tyranid

+0

@tyranid 'typeof (list <>)' si basa sulla riflessione per recuperare il nome; ma vedo il tuo punto ... Potrei usare list_type.Name, giusto? –

risposta

4

Ho paura che non puoi. Non sembra esserci alcun modo per creare un CodeTypeReference da un CodeTypeDeclaration. I penso che sia perché CodeTypeDeclaration non sa in quale spazio dei nomi si trova, quindi non esiste un modo sicuro per farlo.

D'altra parte, quando si crea un tipo generico CodeTypeReference a, non è necessario utilizzare il nome del tipo generico:

var listType = new CodeTypeReference(typeof(List<>)); 
listType.TypeArguments.Add(typeof(int)); 
+0

Il problema è che mi piacerebbe fare 'TypeArguments.Add (my_type_declaration)'. Penso che dovrò usare comunque il nome del mio tipo. Grazie! –

1

La risposta scelta non ha funzionato per me per qualsiasi ragione , ma questo ha fatto:

var listType = new CodeTypeReference("List", new[] { new CodeTypeReference(typeof(int)) });

See documentation here.