2013-04-22 3 views
2

Рассмотрим код ниже:Работа с объектами, созданными с Activator.CreateInstance

void fun1(string typeName) 
{ 
    object adap = Activator.CreateInstance(typeName); 
    adap.dowork(); //won't compile because of strongly typed. 
} 

Использование Activator.CreateInstance() мы можем легко создать экземпляр любого типа, но если мы не знаем TypeName во время разработки, это не возможно, понизить его до его фактического типа.

Мой вопрос в том, как мы можем вызвать функцию экземпляра, созданную Activator.CreateInstance, если мы не можем свести ее к соответствующему типу, поскольку мы не знаем имя типа во время разработки, но мы знаем, что функция существует.

Надеюсь, я ясно дал понять.

+1

Если вы не знаете тип во время компиляции, чем вы знаете, чтобы вызвать dowork() на нем? Существует ли общий интерфейс между этими типами? –

+0

Обычно это делается с интерфейсами. У вас есть абстрактный интерфейс (который действует как «контракт», который не должен сильно меняться), и вы зависите от этой, но не конкретной реализации. Затем вы можете получить информацию о членах реализации через интерфейс. –

+0

Да, вы абсолютно правы, это обычно делается через интерфейсы или наследование, но я не могу использовать их в своем случае, потому что я не тот, кто создает «Тип», объект которого должен быть создан. –

ответ

6

Единственное, что вы можете сделать, это присвоить его типу dynamic.

dynamic adap = Activator.CreateInstance(typeName); 
adap.dowork(); //this now compiles 

Также можно вызвать метод динамически с использованием отражения, если вы знаете имя метода.

3

Наилучший вариант - знать какой-то общий интерфейс или базовый класс и прикладывать к нему. Однако, если это невозможно, вы можете использовать утиный тип с помощью

dynamic adap = ... 

И остальная часть вашего кода как есть.

Если это невозможно (неправильная версия .net и т. Д.), Вам придется использовать отражение.

1

Если вы знаете, что typeName имеет метод doWork, было бы лучше, если ваш тип реализует интерфейс, как:

interface IDoWorkSupport 
{ 
    void DorWork(); 
} 

, то вы можете сделать ваш код:

var adap = (IDoWorkSupport) Activator.CreateInstance(typeName); 
adap.DoWork(); //this now compiles 

В этом в случае его более объектно-ориентированного решения.