Как извлечь полное имя сборки из имени типа, указанного в сборке? - PullRequest
4 голосов
/ 02 декабря 2009

У меня есть имя типа, определенное сборкой, например,

MyNamespace.MyClass, MyAssembly, Версия = 1.0.0.0, Культура = нейтральная, PublicKeyToken = нуль

Я хочу извлечь полное имя сборки, т.е.

MyAssembly, версия = 1.0.0.0, Культура = нейтральная, PublicKeyToken = ноль

Очевидно, что я мог бы сделать это с помощью простого разбора строки, но существует ли метод для этого?

Примечание. У меня нет типа или сборки, только строка, и это является важной частью проблемы, поэтому myType.AssemblyQualifiedName, myType.Assembly.FullName и т. Д.

Ответы [ 3 ]

2 голосов
/ 21 октября 2010

Перегрузка до Type.GetType принимает функцию, которая может использоваться для разрешения AssemblyName в сборке. Возвращение null обычно вызывает исключение, так как тип не может быть разрешен, но это можно подавить, передав false в параметр throwOnError.

Функция, используемая для разрешения, может также установить строковую переменную во внешней области видимости, которую вернет исходный код.

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;
        }
    }
}
1 голос
/ 02 декабря 2009

Здесь:

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

Редактировать: Подожди. У вас нет сборки? Извините, что несу плохие новости, но тогда вам нужно разобрать.

0 голосов
/ 21 октября 2010

Если вы хотите использовать GetType, вам нужно загрузить сборку в текущий домен. Вы можете узнать, как это сделать здесь .

Хотя это кажется большой работой, чтобы избежать тривиального разбора ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...