Приведение одного класса к другому, который перешел из того же baseClass - PullRequest
2 голосов
/ 07 марта 2011

Можно ли привести class1 к class2? переменная результата всегда получает нулевое значение.

class Program
{
    static void Main(string[] args)
    {
        Class1 class1 = new Class1();
        class1.Field1 = "1";
        class1.Field2 = "2";
        class1.Field3 = "3";
        class1.Field4 = "4";
        class1.Field5 = "5";
        BaseClass base1 =  (BaseClass)class1;

        Class2 class2 = base1 as Class2;

        string result = class2.Field1;
    }
}

public class BaseClass
{
    public string Field1 { get; set; }
    public string Field2 { get; set; }
    public string Field3 { get; set; }
}

public class Class1 : BaseClass
{
    public string Field4 { get; set; }
    public string Field5 { get; set; }
}

public class Class2 : BaseClass
{
    public string Field6 { get; set; }
    public string Field7 { get; set; }
}

Ответы [ 6 ]

5 голосов
/ 07 марта 2011

Нет, невозможно разыграть подобное. Вам нужно будет написать свой собственный метод преобразования или оператор. Объект base1 относится просто к , а не к классу 2. Каковы будут значения Field6 и Field7?

0 голосов
/ 07 марта 2011

Предполагая, что вопрос «Почему string result = class2.Field1; умирает с NullReferenceException», я попытаюсь объяснить.

Позволяет немного переименовать классы.Допустим, BaseClass - это Vehicle, Class1 - это Car, а Class2 - это SpaceShuttle.

Итак,

BaseClass base1 =  (BaseClass)class1; 
//becomes
Vehicle myVehicle =  (Vehicle) myCar; 

Нет проблем, приведение не является даже необходимым.Автомобиль - это всегда средство передвижения.Но

Class2 class2 = base1 as Class2;
//becomes
SpaceShuttle shuttle = myVehicle as SpaceShuttle.

Здесь я говорю, что мой автомобиль - космический корабль, а на самом деле это старая Honda Civic.Компилятор замечает это и устанавливает переменную shuttle в null, потому что это то, что оператор as делает .Если вы спросите myVehicle, является ли это SpaceShuttle, он ответит NO , например:

bool isShuttle = (myVehicle is SpaceShuttle); //false

Так что даже если и SpaceShuttle, и Car имеют одинаковое свойство, унаследованное отТранспортные средства, скажем, Color или Owner или что-то еще, это не значит, что я могу относиться к своей машине как к космическому шаттлу.

0 голосов
/ 07 марта 2011

Проблемная строка:

Class2 class2 = base1 as Class2;

Проблема в том, что он не знает, что делать с Field6 или Field7. Вы должны написать свое собственное преобразование, чтобы эти поля были отсортированы.

0 голосов
/ 07 марта 2011

Проблема в том, что ваш Class1 не может быть преобразован в Class2.

Когда вы делаете

BaseClass base1 =  (BaseClass)class1;

Вы изменяете только ссылку, а не сам объект. Объект знает, что это Class1. Поэтому, когда вы пытаетесь разыграть как Class2, он завершается неудачей, поскольку один не наследуется от другого.

0 голосов
/ 07 марта 2011

«Можно ли это сделать?»

Нет, они оба BaseClass и могут быть разыграны до BaseClass, но вы не можете разыграть Class1 до Class2 или наоборот. Также нельзя BaseClass привести к Class1. Вы можете разыгрывать только вверх в цепочке наследования.

Если вы пытаетесь преодолеть громоздкие сопоставления или что-то еще, рассмотрите AutoMapper для ваших сопоставлений, который действительно полезен в этих случаях.

0 голосов
/ 07 марта 2011

Невозможно привести Класс1 к Классу2.Но к BaseClass это, конечно, возможно.

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