C# 获取抽象类的当前实例,并使用该实例调用C中的特定子类属性#

C# 获取抽象类的当前实例,并使用该实例调用C中的特定子类属性#,c#,inheritance,properties,abstract,C#,Inheritance,Properties,Abstract,我不确定标题是否令人困惑,请随意编辑 我有以下示例代码 public abstract class A { public int P1 {get; set;} } public class B : A { public int p2 {get; set;} } public class C : A { public int p2 {get; set;} } public class test { A a = null; public test(A a1)

我不确定标题是否令人困惑,请随意编辑

我有以下示例代码

public abstract class A 
{
    public int P1 {get; set;}

}

public class B : A 
{
    public int p2 {get; set;}
}

public class C : A
{
    public int p2 {get; set;}
}


public class test 
{
A a = null;

public test(A a1)
{
  a = a1;
}

public void foo()
{
    if((a as B)!=null)
    {
        (a as B).p2 = 1;
    }
    else if ((a as C)!=null)
    {
        (a as C).p2 = 2;
    }
}
}

P2不存在于抽象类中,只有类的某些继承将拥有它。要设置此属性,我需要检查当前实例的类型是Class B还是C,然后设置属性。每次我要添加一个类,它有这个属性,我需要添加一个检查它。有没有一种方法可以抓取实例并检查P2是否存在,而不是在不检查每种类型的情况下设置它


谢谢

一些选项,没有一个是理想的:

编译时不安全的选项:

  • 使用反射查看对象是否具有
    p2
    属性(如果有,则设置该属性)
  • 使用
    dynamic
    并在运行时处理任何异常
需要更改类设计的选项

  • 创建从
    A
    继承并具有
    p2
    属性并强制转换为该类型的中间类型
  • 使用
    p2
    属性定义一个接口,该属性
    B
    C
    都实现并尝试强制转换到该接口

如果P2是另一个类的实例,例如如何使用反射从P2调用方法,如P2.F00()foreach(A.GetType().GetProperties()中的var属性){if(property.Name==“P2”){property.Foo()?}您必须从该属性获取值并将其转换为正确的类型,或者再次使用反射和/或
动态