Domanda

Supponendo che io abbia solo il nome della classe di un generico come stringa sotto forma di " MyCustomGenericCollection (of MyCustomObjectClass) " e non conosco l'assembly da cui proviene, qual è il modo più semplice per creare un'istanza di quell'oggetto?

Se aiuta, so che la classe implementa IMyCustomInterface e proviene da un assembly caricato nell'AppDomain corrente.

Markus Olsson ha fornito un eccellente esempio qui , ma non vedo come per applicarlo ai generici.

È stato utile?

Soluzione

Una volta analizzato, utilizzare Type.GetType (string) per ottenere un riferimento ai tipi coinvolti, quindi utilizzare Type.MakeGenericType (Digita []) per costruire il tipo generico specifico di cui hai bisogno. Quindi, utilizza Type.GetConstructor (Type []) per ottenere un riferimento a un costruttore per il tipo generico specifico e infine chiamare ConstructorInfo.Invoke per ottenere un'istanza dell'oggetto.

Type t1 = Type.GetType("MyCustomGenericCollection");
Type t2 = Type.GetType("MyCustomObjectClass");
Type t3 = t1.MakeGenericType(new Type[] { t2 });
ConstructorInfo ci = t3.GetConstructor(Type.EmptyTypes);
object obj = ci.Invoke(null);

Altri suggerimenti

L'articolo MSDN Procedura: esaminare e creare istanze di tipi generici con Reflection descrive come utilizzare Reflection per creare un'istanza di un tipo generico. Usarlo insieme al campione di Marksus dovrebbe sperare di iniziare.

Se non ti dispiace tradurre in VB.NET, qualcosa del genere dovrebbe funzionare

foreach (Assembly assembly in AppDomain.CurrentDomain.GetAssemblies())
{
    // find the type of the item
    Type itemType = assembly.GetType("MyCustomObjectClass", false);
    // if we didnt find it, go to the next assembly
    if (itemType == null)
    {
        continue;
    }
    // Now create a generic type for the collection
    Type colType = assembly.GetType("MyCusomgGenericCollection").MakeGenericType(itemType);;

    IMyCustomInterface result = (IMyCustomInterface)Activator.CreateInstance(colType);
    break;
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top