Вы можете использовать сопоставление с шаблоном с оператором is
, чтобы сделать его более понятным
IAb AorB = MyMethods.CreateObject(typeof(B));
Console.WriteLine(AorB.Prop1);
if (AorB is B b)
{
Console.WriteLine(b.Prop2);
}
Ваша неудачная строка становится правильной после использования правой круглой скобки
Console.WriteLine(((B)AorB).Prop2);
Также нет необходимости наследовать класс B
как от класса A
, так и от интерфейса IAB
. Поскольку A
уже реализует IAB
, вы можете просто использовать public class B : A
Есть ли лучший способ указать тип возвращаемого значения для примера метода?
Сделайте метод CreateObject
generi c и используйте ограничения для ограничения параметра типа T
классом, который реализует интерфейс IAb
и имеет конструктор без параметров (именно это new()
означает именно)
public static T CreateObject<T>() where T : IAb, new()
{
return new T { Prop1 = 123 };
}
и вызвать его следующим образом:
IAb AorB = MyMethods.CreateObject<B>();
Но в этом случае вы можете установить только свойства, определенные в интерфейсе IAb
, а не B
класс, указанный c.