2009-12-02 4 views
4

J'ai un nom qualifié d'assembly d'un type, par ex.Comment extraire un nom complet d'assembly du nom qualifié d'assembly d'un type?

MyNamespace.MyClass, MyAssembly, Version = 1.0.0.0, Culture = neutral, PublicKeyToken = null

Je veux extraire le nom de montage complet, à savoir

MyAssembly , Version = 1.0.0.0, Culture = neutre, PublicKeyToken = null

Évidemment, je pourrais le faire avec l'analyse de chaînes simple, mais est là une méthode de cadre pour faire cela?

Note: Je n'ai pas le type ou l'assemblage, juste la chaîne, ce qui est une partie essentielle du problème, donc myType.AssemblyQualifiedName, myType.Assembly.FullName, etc ne va pas aider

Répondre

1

ici:

public string AssemblyName(string assemblyQualifiedName) { 
    Type type = Type.GetType(assemblyQualifiedName, false); 
    if(type == null) { 
     return Parse(assemblyQualifiedName); 
    } 
    return type.Assembly.Name; 
} 

Edit: Attendez. Vous n'avez pas l'assemblée? Désolé d'être le porteur de mauvaises nouvelles, mais alors vous devez analyser.

+0

Malheureusement ma demande ne me avoir accès au type réel pour appeler à GetType au moment où je dois effectuer l'analyse syntaxique ... –

+0

K @ Paul: Oui, si vous ne disposez pas de l'ensemble alors vous devez analyser la chaîne. La réflexion, etc. ne vous aidera pas ici car le CLR ne peut pas trouver les métadonnées pour que le type effectue une réflexion. J'essaie d'éviter les motifs de questionnement, mais qu'est-ce qui ne va pas avec l'analyse ici? – jason

+0

@Jason, thx pour votre entrée ... rien de mal à l'analyse si c'est ce que je dois recourir, mais le FQN peut s'impliquer (MSDN "Spécification des noms de type entièrement qualifiés"), et je viens juste d'une solution de cadre publique exposée pourrait exister car il doit analyser ces choses de toute façon ... –

0

Si vous souhaitez utiliser GetType, vous devez charger l'assembly dans le domaine en cours. Vous pouvez apprendre à le faire here.

Bien qu'il semble que beaucoup de travail juste pour éviter l'analyse syntaxique trivial ...

2

Un overload-Type.GetType accepte une fonction qui peut être utilisé pour résoudre le AssemblyName à un ensemble. Renvoyer la valeur null produira normalement une exception puisque le type ne peut pas être résolu, mais cela peut être supprimé en transmettant false au paramètre throwOnError.

La fonction utilisée pour résoudre peut également définir une variable de chaîne dans la portée externe que le code d'origine retournera.

using System; 
using System.Diagnostics; 
using System.Reflection; 

namespace ConsoleApp { 
    public static class Program { 
     public static void Main() { 
      var assemblyName = GetAssemblyName("MyNamespace.MyClass, MyAssembly, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"); 
      Debug.Assert(assemblyName == "MyAssembly, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"); 
     } 

     public static String GetAssemblyName(String typeName) { 
      String assemblyName = null; 
      Func<AssemblyName, Assembly> assemblyResolver = name => { 
       assemblyName = name.FullName; 
       return null; 
      }; 

      var type = Type.GetType(typeName, assemblyResolver, null, false); 
      if (type != null) 
       return type.AssemblyQualifiedName; 

      return assemblyName; 
     } 
    } 
} 
Questions connexes