Domanda

Ho del codice per caricare un assembly e ottenere tutti i tipi, che implementano una determinata interfaccia, come questa (supponiamo che asm sia un assembly valido e caricato).

var results = from type in asm.GetTypes()
  where typeof(IServiceJob).IsAssignableFrom(type)
  select type;

Ora sono bloccato: ho bisogno di creare istanze di questi oggetti e invocare metodi e proprietà sull'oggetto. E ho bisogno di memorizzare i riferimenti agli oggetti creati in un array per un uso successivo.

È stato utile?

Soluzione

Oh wow - ho solo blog su questo a pochi giorni fa. Ecco il mio metodo per restituire istanze di tutti i tipi che implementano una determinata interfaccia:

private static IEnumerable<T> InstancesOf<T>() where T : class
{
    var type = typeof(T);
    return from t in type.Assembly.GetExportedTypes()
           where t.IsClass
               && type.IsAssignableFrom(t)
               && t.GetConstructor(new Type[0]) != null
           select (T)Activator.CreateInstance(t);
}

Se si esegue il refactor per accettare un parametro assembly anziché utilizzare l'assembly dell'interfaccia, diventa abbastanza flessibile da soddisfare le proprie esigenze.

Altri suggerimenti

Puoi creare un'istanza di un tipo con il metodo Activator.CreateInstance : -

IServiceJob x = Activator.CreateInstance(type);

Quindi il tuo codice diventa: -

IServiceJob[] results = (from type in asm.GetTypes()
  where typeof(IServiceJob).IsAssignableFrom(type)
  select (IServiceJob)Activator.CreateInstance(type)).ToArray();

(Nota cambia var in IServiceJob [] per chiarire cosa viene creato).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top