Im leggermente confuso da un errore C#.Tipo C# o spazio dei nomi confusione atteso
Type t = thing.GetType()
t
è ora un tipo. ma se tento di fare questo:
new GenericThing<t>
Ho ricevuto un avviso di tipo o spazio previsto dicendo. Cosa mi manca?
Im leggermente confuso da un errore C#.Tipo C# o spazio dei nomi confusione atteso
Type t = thing.GetType()
t
è ora un tipo. ma se tento di fare questo:
new GenericThing<t>
Ho ricevuto un avviso di tipo o spazio previsto dicendo. Cosa mi manca?
t
è un oggetto di tipo creato in fase di esecuzione. I generici si aspettano un nome di tipo, risolto in fase di compilazione. Per creare un generico in fase di esecuzione, è necessario utilizzare MakeGenericType
Ad esempio:
Activator.CreateInstance(typeof(GenericThing<>).MakeGenericType(t));
t
è un'istanza oggetto di tipo Type
, vale a dire qualcosa che esiste solo in fase di esecuzione. I generici lavorano in fase di compilazione e si aspettano il nome del tipo.
Penso che si accetta che il seguente non ha senso:
Type t = thing.GetType()
TypeOfThing instance = new t();
E per lo stesso motivo, non è possibile passare un'istanza del tipo come parametro di un generico.
Type
è una classe che rappresenta un tipo piuttosto che realmente essere uno, quindi non è possibile utilizzare un'istanza di Type
in un luogo che si aspetta un parametro di tipo o tipo.
si dovrebbe fare qualcosa di simile:
var youGeneric = typeof(GenericThing<>).MakeGenericType(t)
.GetConstructor(Type.EmptyTypes)
.Invoke(null);