是否有可能得到派生类'属性,如果它是基类的形式
本文关键字:如果 基类 属性 有可能 派生 是否 | 更新日期: 2023-09-27 18:04:13
我有三个类,分别是ClassA
, ClassB
, ClassC
。ClassC继承自ClassB, ClassB继承自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反射有多昂贵?