Up casting - С#

public class a{
  public string x1 {get;set;}
  public string x2 {get;set;}
  public string x3 {get;set;}
}

public class b:a{
}

Очевидно, что var foo = (b)new a(); будет бросать ошибку кастинга во время выполнения.

Единственный другой способ, который я могу представить, чтобы назначить все свойства уже созданного и заполненного a, состоит в том, чтобы вручную скопировать каждый из них в новый экземпляр b.

Правильно ли это?

Ответ 1

Этот тип приведения неправильный, потому что вы не можете отдать родителей своим детям.
Тип a не знает о метаинформации типа b. Поэтому вам нужно предоставить явный оператор литья, чтобы делать такие вещи, , но в этом случае вы должны удалить наследование.
Другой вариант - определить какой-то интерфейс, например, в других вопросах.

Дополнительная информация:
http://msdn.microsoft.com/en-us/library/ms173105.aspx
http://msdn.microsoft.com/en-us/library/85w54y0a.aspx

Ответ 2

Невозможно. Даже если вы думаете, что у вас есть это, компилятор будет жаловаться.

Это обычно указывает на конструкцию или логическую ошибку.

Ответ 3

Это то, что меня всегда беспокоило. Я разработал решение для этого, создав свою собственную утилиту Up-Casting.

Здесь вы можете прочитать мою статью о том, как это сделать - на самом деле это довольно просто.

http://sympletech.com/c-up-casting-utility/

Ответ 4

То, что вы на самом деле ищете, на самом деле является DOWNCAST, а не upcast. Для этого предположим, что у вас есть объект класса a say ObjA. Теперь, чтобы создать объект ObjNewA, сделайте следующее:

b new_ObjNewA = ObjA as b;

приведенный выше код должен работать на 100%

Подумайте об этом следующим образом: ClassName NewObject = OldObject как ClassName;

где имя класса - унаследованный класс или дочерний класс. Вот скриншот, чтобы убедиться, что он работает:

enter image description here

Ответ 5

Вы не можете сделать это.

Вы можете, и я думаю, вы должны использовать интерфейс.

public interface ia
{
    string x1 { get; set; }
    string x2 { get; set; }
    string x3 { get; set; }
}
public class a : ia
{
    public string x1 { get; set; }
    public string x2 { get; set; }
    public string x3 { get; set; }
}

public class b : a, ia
{
}

Тогда вы можете

ia foo = new a();

Ответ 6

На самом деле, ваша идея создания нового экземпляра b и копирования значений поля ему кажется интересным. использование рефлексии для достижения этого должно хорошо соответствовать счету.

Что-то вроде: итерация по всем полям, их значения сохраняются в и сохраняются в одном поле в b.

Тем не менее, это не "downcasting" - поскольку это означает, что создается совершенно другой объект - в отличие от переинтерпретации значения существующего объекта.

Ответ 7

Как говорят все, это невозможно. Неявное кастинг - это одно решение, но я предпочитаю создавать конструктор на b, который принимает экземпляр типа a...

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