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

时间:2016-06-21 21:23:58

标签: 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)
{
  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是否存在而不是检查每种类型。

由于

1 个答案:

答案 0 :(得分:3)

一些选项,其中没有一个是理想选择:

非编译时安全的选项:

  • 使用反射来查看对象是否具有p2属性(如果有,则设置它)
  • 使用dynamic并在运行时处理任何异常

需要更改班级设计的选项

  • 创建一个继承自A且具有p2属性并强制转换为该类型的中间类型
  • 定义一个p2属性的接口,BC都实现并尝试强制转换为该接口。