C # Создать экземпляр класса из типа FullName - PullRequest
0 голосов
/ 14 мая 2019

Кто-нибудь знает простой способ создания экземпляра класса с заданным FullName типа (формат namespace.classname), но без использования AssemblyQualifiedName?FullName типа содержится только в одной сборке, на которую есть ссылки и которая доступна во время выполнения, поэтому двусмысленности нет.

У меня нет типа, у меня есть строка - только полное имя, безсборочная часть.Я не знаю сборку, я просто знаю, что на нее ссылаются, и есть только одна сборка, содержащая тип полное имя.

Спасибо!

РЕДАКТИРОВАТЬ: Это связано с десериализацией экземпляров изпроприетарный протокол.Я получил хорошие ответы, но в конечном итоге я сделаю для того, чтобы найти оптимальное решение и не выполнять итерацию по всем сборкам, - это создать статический словарь с ключом fullName и квалифицированным именем сборки в качестве значения, поскольку я знаю, какие именноклассы и они ограничены.

Ответы [ 2 ]

3 голосов
/ 14 мая 2019

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

0 голосов
/ 14 мая 2019

Загрузите все свои сборки и выберите их типы, затем отфильтруйте по имени.

public static object CreateType(string typeName)
{
    var allTypes = AppDomain.CurrentDomain
        .GetAssemblies()
        .SelectMany
        (
            a => a.GetTypes()
        );
    var type = allTypes.Single( t => t.Name == typeName );

    return Activator.CreateInstance(type);
}

Вы можете добавить код проверки, чтобы проверить наличие дубликатов и убедиться, что имеется конструктор по умолчанию.

...