是否有可能得到派生类'属性,如果它是基类的形式

本文关键字:如果 基类 属性 有可能 派生 是否 | 更新日期: 2023-09-27 18:04:13

我有三个类,分别是ClassA, ClassB, ClassCClassC继承自ClassBClassB继承自ClassA。它们不是静态类。

ClassC有一个唯一的属性,让它是"Name",这是不是继承自类B或c的

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

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

然后我创建了一个ClassA的实例,并将instanceOfClassC赋值给它:

ClassA instanceofClassA = instanceOfClassC;

然后我的问题是:是否有可能从instanceOfClassA获得"类名"?我读了这个和这个,但仍然没有失去我的心。我正在写一个转换器,所以我希望在不重新设计我的类的情况下得到一个解决方案。

是否有可能得到派生类'属性,如果它是基类的形式

必须将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; 

将变量命名为instanceOfClassA会产生误导。ClassC的实例始终是该类的实例,即使将其赋值给ClassA类型的变量后也是如此。然而,当使用ClassA类型的变量时,编译器不知道这是您的ClassC 实例,还是您为它分配了一个不同的ClassA实例。

要访问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;
}

变量instanceofClassA声明为ClassA,其值类型为ClassB。可以通过反射获取属性值。

public T2 GetPropertyValue<T1, T2>(T1 sourceObject, string propertyName) {
    var value = typeof(T1).GetProperty(propertyName).GetValue(sourceObject);
    return (T2)value;
}

但是,在某些场景中使用反射存在性能缺陷。

参见:.NET反射有多昂贵?