Как я могу создать экземпляр, когда у меня есть только имя класса? - PullRequest
0 голосов
/ 07 октября 2011

Я ищу решение для создания одноэлементных экземпляров классов, когда будут доступны только имена классов.

Я посмотрел на Activator.CreateInstance(), но для этого нужно переписать оригиналобъект для вызова метода.Затем я вошел, чтобы посмотреть, как MEF может помочь, что, кажется, является маршрутом, по которому я хочу идти, но я не уверен, является ли это излишним для того, чего я хотел бы достичь.

ВКороче говоря, у меня есть ссылки на веб-сервисы (ASMX) с разными именами.Эти имена будут отображаться в поле со списком в приложении WinForms, когда пользователь вводит URL-адрес приложения.После этого необходимо вызвать несколько методов, предоставляемых каждой из служб, однако классы будут виртуальными методами в абстрактном классе.

Это звучит очень похоже на инфраструктуру подключаемого модуля, ноидея заключается в том, чтобы вызывать определенные веб-службы Microsoft в Office SharePoint Server (2007/2010) динамически в зависимости от типа установленной основы.

Надеюсь, у меня достаточно контекста.

Ответы [ 2 ]

1 голос
/ 07 октября 2011

Вы используете C # 4 и .NET 4? Если это так, вы можете просто использовать:

Type type = Type.GetType(typeName);
dynamic service = Activator.CreateInstance(type);
service.FirstCommonMethod("foo", "bar");
service.SecondCommonMethod();

Обратите внимание, что typeName должен минимум быть квалифицированным для пространства имен, и если тип находится в сборке, отличной от mscorlib или в вызывающей сборке, он также должен быть квалифицирован в сборке.

0 голосов
/ 27 января 2015

Следующий код немного быстрее, чем при использовании Activator.CreateInstance, но только чуть-чуть.В основном я просто иллюстрирую другой способ создания объекта с помощью Type.

var type = Type.GetType(yourClassNamePossiblyWithLeadingNamespaces);
var expressionNew = Expression.New(type);
var typeFactory = Expression.Lambda<Func<dynamic>>(expressionNew).Compile();
var instanceOfClass = typeFactory();

РЕДАКТИРОВАТЬ: То же, что и ответ Джона: для использования dynamic.

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