Невозможно просто привести один объект другого типа, даже если у них есть один родительский элемент, поскольку у них могут быть разные интерфейсы.
Вам необходимо реализовать явный или косвенный оператор ChildA (или ChildB).
class ClassA
{
public string Property1 { get; set; }
}
class ClassB
{
public string Property2 { get; set; }
public static implicit operator ClassB(ClassA classA)
{
return new ClassB() { Property2 = classA.Property1 };
}
}
или
class ClassA
{ {
public string Property1 { get; set; }
public static explicit operator ClassB(ClassA classA)
{
return new ClassB() { Property2 = classA.Property1 };
}
}
class ClassB
{
public string Property2 { get; set; }
}
А после реализации разговоров операторы будут нормально работать со следующим кодом:
var a = new ClassA() {Property1 = "test"};
ClassB b = (ClassB)a;
Console.WriteLine(b.Property2); // output is "test"
В первом случае вы можете явно пропустить преобразование типов и написать так:
var a = new ClassA() {Property1 = "test"};
ClassB b = a;
И, наконец, если вы хотите синхронизировать только свойства родительского класса, вы можете написать конвертер непосредственно в родительском:
class Parent
{
public string ParentProperty { get; set; }
public static T1 Convert<T1>(Parent obj) where T1 : Parent, new()
{
var result = new T1();
result.ParentProperty = obj.ParentProperty;
return result;
}
}
Использование (потомки родителей ClassA и ClassB):
var a = new ClassA();
a.ParentProperty = "test";
ClassB b = Parent.Convert<ClassB>(a);
Console.WriteLine(b.ParentProperty); // output is "test"