2016-03-01 3 views
1

У меня есть класс A и класс B, который происходит от A. У меня есть экземпляр B, а именно b, из которого я хочу извлечь только часть A. Что-то вроде:Извлечение базового объекта из производного объекта

var b = new B(); 
A a = (SomeCast)b; 

Загвоздка a.GetType() должен возвращать A Тип не B.

Возможно ли создать экземпляр A и вручную скопировать все поля и свойства из b?

Обновление Корень проблемы возникает из Entity Framework, которая не позволяет добавлять производные типы вместо базового типа. У меня есть производный тип biiig (к которому я не могу добавить аннотации) и хочу добавить только базовую часть в базу данных.

Мне просто интересно, что есть простой ответ.

+6

Basic полиморфизма делает вывод, что 'b' * * является экземпляром' Ā' для всех намерений и целей. 'A a = b;' логически является экземпляром 'A'. Зачем вам также нужно «GetType()», чтобы продемонстрировать это? Сделав шаг назад, в чем проблема? – David

+1

Корень проблемы возникает из Entity Framework, которая не позволяет добавлять производные типы вместо базового типа. У меня есть производный тип biiig (к которому я не могу добавить аннотации) и хочу добавить только базовую часть в базу данных. –

+2

Вы должны обязательно добавить этот контекст к вопросу, а также, возможно, пример попытки использовать переменную в EF и вызвавшую ее ошибку. Это может быть скорее вопросом EF, чем вопросом полиморфизма, и вы захотите убедиться в том, что этот вопрос привлекает правильное внимание экспертов. – David

ответ

0

Если B наследует от A, им все экземпляры B будут тоже экземпляры A, все поля и свойства A доступны в экземпляре B.

В вашем коде, вам не нужно бросать, просто сделать правопреемником:

var b = new B(); 
A a = b; 

Но это не нужно, вы можете работать с b как пример A, без создания переменной a ,

+0

Спасибо Arturo, но a.GetType() возвращает B, а не A. –

+0

Несомненно, если a.GetType() вернул A, вы потеряете все лишние вещи, которые у вас были в B? Я думаю, что здесь есть фрагмент. Все «не позволяет добавлять производные типы вместо базового типа» действительно странно. Я полагаю, что если объекты были скопированы по значению, тогда у вас будет проблема нарезания. – Skizz

0

Отказ от ответственности: Гадкий код впереди

Ну, я собираюсь рисковать себя получить много отрицательной обратной связи, но давайте посмотрим, если это то, что хочет ОП.

Как вам уже все говорили, не существует способа «разбить» полученный на базовый класс. Так что я предлагаю здесь просто взломать, используя отражение.

public class A 
{ 
    public A() 
    { 
    } 

    public A(B inhClass) 
    { 
     foreach (var prop in typeof(A).GetProperties()) 
     { 
      PropertyInfo myPropInfo = typeof(B).GetProperty(prop.Name); 
      prop.SetValue(this, myPropInfo.GetValue(inhClass, null), null); 
     } 
    } 
    public string a { get; set; } 
} 

public class B:A 
{ 
    public string b { get; set; } 
    public A baseclass 
    { 
     get 
     { 
      return new A(this); 
     } 
    } 


} 

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

Вот это, я открыт для публичного линчевания :)

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