如果它是基类的形式,是否可以获得派生类'属性?

时间:2014-05-19 10:39:33

标签: c# polymorphism converter

我有三个班级,即ClassAClassBClassC ClassC 继承自 ClassB ClassB 继承自 ClassA 。它们不是静态类。

ClassC 有一个唯一的属性,让它为“名称”,这是继承自B类或C类。

假设我创建了一个ClassC实例,即 instanceOfClassC

ClassC instanceOfClassC = new ClassC();
instanceOfClassC.Name = "name of class";

然后我创建一个 ClassA 的实例,并为其分配 instanceOfClassC

ClassA instanceofClassA = instanceOfClassC;

然后我的问题是:是否可以从instanceOfClassA获取“类名”?我已阅读thisthis,但仍然没有丢失我的心。我正在编写一个转换器,所以我希望在不重新设计我的课程的情况下获得解决方案。

3 个答案:

答案 0 :(得分:2)

您必须将ClassA投回ClassC才能访问ClassC上的成员:

ClassC instanceOfClassC = new ClassC();
instanceOfClassC.Name = "name of class";

ClassA insanceofClassA = instanceOfClassC;
// insanceofClassA.Name not possible as ClassA does not have a member "Name".

ClassC c = (ClassC)insanceofClassA;
string name = c.Name; 

答案 1 :(得分:1)

命名变量instanceOfClassA具有误导性。 ClassC的实例将始终是该类的实例,即使在将其分配给类型为ClassA的变量之后也是如此。但是,当使用类型为ClassA变量时,编译器不知道这是您的ClassC 实例,还是分配了不同的ClassA {1}}实例。

要访问ClassC成员,您需要将其强制转换,然后再选择验证您确实正在处理ClassC类型:

ClassC myClassC = instanceOfClassA as ClassC;
if (myClassC != null)
{
    // It's a class C and it's been cast already
}

if (instanceOfClassA is ClassC)
{
    // It's a class C, cast it
    ClassC myClassC = (ClassC)instanceOfClassA;
}

答案 2 :(得分:0)

变量instanceofClassA被声明为ClassA,其值类型为ClassB。用反射可以获得财产的价值。

public T2 GetPropertyValue<T1, T2>(T1 sourceObject, string propertyName) {

    var value = typeof(T1).GetProperty(propertyName).GetValue(sourceObject);
    return (T2)value;
}

但是,在某些情况下使用反射会有性能缺陷。

请参阅:How costly is .NET reflection?