2016-02-20 2 views
-1

Кто-нибудь, пожалуйста, предложите, как сделать приведенный ниже сценарий.Как отличить базовый класс по типу

У меня есть имя случая класса BaseData и производный класс с именем DerivedData

Type classtype=Assembly.GetAssembly(typeof(BaseData)).GetType("DerivedData"); 
BaseData baseobject= Activator.CreateInstance(classtype) as BaseData; 

Теперь я хочу, чтобы отливать BaseData к DerivedData, что-то, как показано ниже.

Примечание: (baseobject.getType()) является недопустимым синтаксисом.

DerivedData objderived= (baseobject.getType())baseobject; 

Отредактировано: Я пытаюсь удалить условие if, потому что BaseData получил несколько DerivedData.

if (baseobject is DerivedData1) 
{ 
    db.Set<DerivedData1>().Add((DerivedData1)data); 
} 
else if (data is DerivedData2) 
{ 
    db.Set<DerivedData2>().Add((DerivedData2)data); 
} 
else if (data is DerivedData3) 
{ 
    db.Set<DerivedData3>().Add((DerivedData3)data); 
} 
+0

Является 'типа DerivedData' статически доступен в коде, который нуждается в этом актерском? – Dennis

+0

@Dennis Вы имеете в виду экземпляр DerivedData? .DerivedData унаследован от BaseData. – user3796642

+0

Нет, я имею в виду статическую ссылку на сборку, где объявляется 'DerivedData'. С технической точки зрения, простое выполнение: 'var objDerived = (DerivedData) baseobject'. Но это разрешено только в том случае, если «DerivedData» известен статически. На самом деле это похоже на XY-проблему. – Dennis

ответ

0

, если вы можете достичь BaseData, обращаясь к нему непосредственно вы можете достичь DrivedData также?

Type classtype = Assembly.GetAssembly(typeof(DerivedData)).GetType("DerivedData"); 
DerivedData dreivedobject = Activator.CreateInstance(classtype) as DerivedData; 
+0

Активатор создаст новый экземпляр DeriveData, но я хочу использовать существующий объект. Перед литьем я буду присваивать значение производному объекту. – user3796642

+0

, если вы введете 'DreviedData' в код, есть ли у компилятора проблемы или нет? Я имею в виду, вы можете видеть этот тип во время компиляции? –

+0

У меня нет компилятора. Тип.DeivedData существует в сборке. У вас есть несколько DerivedData, например DerivedData1, DerivedData2, DerivedData3, ect.So на основе строки, которую я передаю в GetType («DerivedData1»), активатор будет создайте экземпляр. благодаря – user3796642

2

В соответствии с вашими редактирования и предполагая, что:

  • db является DbContext;
  • BaseData иерархия существует только на уровне кода (таким образом, типы, полученные от BaseData, не находятся в иерархии TPH, TPT или TPCT с точки EF-модели);

просто использовать non-generic API:

var baseobject = // create BaseData descendant somehow; 
db.Set(baseobject.GetType()).Add(baseobject); 
Смежные вопросы