Domanda

In Net, dato un nome del tipo, c'è un metodo che mi dice in cui il montaggio (istanza di System.Reflection.Assembly), che tipo è definito?

I supporre che il mio progetto ha già un riferimento a tale assemblea, solo bisogno di sapere quale sia.

È stato utile?

Soluzione

Assembly.GetAssembly presuppone che un'istanza del tipo e Type.GetType presuppone che il nome di tipo completo, che include il nome di montaggio.

Se avete solo il nome del tipo di base, è necessario fare qualcosa di più simile a questo:

public static String GetAssemblyNameContainingType(String typeName) 
{
    foreach (Assembly currentassembly in AppDomain.CurrentDomain.GetAssemblies()) 
    {
        Type t = currentassembly.GetType(typeName, false, true);
        if (t != null) {return currentassembly.FullName;}
    }

    return "not found";
}

Ciò presuppone anche il tipo viene dichiarato nella radice. Si avrebbe bisogno di fornire il tipo di spazio dei nomi o che racchiudono nel nome, o iterare nello stesso modo.

Altri suggerimenti

Assembly.GetAssembly(typeof(System.Int32))

Sostituire System.Int32 con qualsiasi tipo vi capita di bisogno. Perché accetta un parametro Type, si può fare qualsiasi cosa in questo modo, per esempio:

string GetAssemblyLocationOfObject(object o) {
    return Assembly.GetAssembly(o.GetType()).Location;
}

Ho adattato la risposta accettata per i miei scopi (ritorno l'oggetto assemblea al posto del nome di montaggio), e refactoring del codice per VB.NET e LINQ:

Public Function GetAssemblyForType(typeName As String) As Assembly
    Return AppDomain.CurrentDomain.GetAssemblies.FirstOrDefault(Function(a) a.GetType(typeName, False, True) IsNot Nothing)
End Function

Sto solo condividendo qui se qualcun altro vorrebbe una soluzione LINQy alla risposta accettata.

Type.GetType(typeNameString).Assembly

Se si può utilizzare, questa sintassi è la più breve / più pulita:

typeof(int).Assembly
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top