2012-05-31 4 views
5

Я уверен, что это было задано раньше, но, к сожалению, единственное, что я нашел, это this, что не было решением для меня. В моем текущем проекте я сделать что-то вроде:Как динамически менять объект?

private object obj; 

private void Initialize() 
{ 
    obj.Initialize(); 
} 

private void CreateInstanceA() 
{ 
    obj = Activator.CreateInstance(typeof(MyClassA)); 
} 

private void CreateInstanceB() 
{ 
    obj = Activator.CreateInstance(typeof(MyClassB)); 
} 

Этот код не работает, конечно, потому что я не бросил obj потому, что его тип изменяется динамически.

Как я могу использовать его динамически?

+4

Кажется, что это был бы не лучший способ пойти на все. Вид запаха кода для меня. Каков более общий контекст того, что вы пытаетесь выполнить? – FishBasketGordo

+0

Помимо инициализации, что еще вы намерены делать с 'obj'? –

+0

@RaymondChen Я только что сделал простой проект WinForm, чтобы протестировать библиотеки классов. – Leri

ответ

9

Три варианта:

  • Если вы контролируете оба класса, и вы можете сделать их реализовать общий интерфейс, который включает в себя все, что вам нужно, то сделать это - и брошенные к интерфейсу
  • Если вы используя C# 4 и .NET 4, вы можете использовать динамическую типизацию - просто объявите переменную как private dynamic obj;, и она будет компилировать и найти правильный метод во время выполнения
  • В противном случае используйте отражение, чтобы найти и вызвать метод.

В основном литье на основе типа времени выполнения не имеет смысла, так как часть точки литья, чтобы дать компилятора больше информации ... и вы просто не имеете, что в Это дело.

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

+1

Что такое инъекция зависимостей –

+1

Инъекция зависимостей без интерфейсов/Абстрактный базовый класс? Как? Если интерфейсы могут быть определены, сценарий в первую очередь достаточен – Tilak

+0

Не лучший ли базовый класс, а не интерфейс? Это * is-a * (абстрактный класс), в отличие от * can-do * (interface). Предполагая, что типы аналогичны по своему характеру – mattytommo

0

Я предполагаю, что CreatInstanceB() должен действительно использовать MyClassB, правильно?

В этом случае вы можете использовать:

((MyClassA)obj).Initialize(); 

...

((MyClassB)obj).Initialize(); 

Или вы могли бы сделать интерфейс, который имеет метод Initialize и определить OBJ, как этот интерфейс.

+0

Я думаю, в методе инициализации MyClassA или MyClassB не известны, что является вопросом в вопросе – Tilak

+0

Да, вы правы. Я редактировал вопрос. Лучше использовать ключевое слово 'dynamic', как предлагалось @JonSkeet. – Leri

+0

Правда, пропустил это. Мы всегда можем положиться на мистера Скита. – Slugart

Смежные вопросы