我有三个班级,即ClassA
,ClassB
,ClassC
。
ClassC 继承自 ClassB , ClassB 继承自 ClassA 。它们不是静态类。
ClassC 有一个唯一的属性,让它为“名称”,这是不继承自B类或C类。
假设我创建了一个ClassC实例,即 instanceOfClassC :
ClassC instanceOfClassC = new ClassC();
instanceOfClassC.Name = "name of class";
然后我创建一个 ClassA 的实例,并为其分配 instanceOfClassC :
ClassA instanceofClassA = instanceOfClassC;
然后我的问题是:是否可以从instanceOfClassA获取“类名”?我已阅读this和this,但仍然没有丢失我的心。我正在编写一个转换器,所以我希望在不重新设计我的课程的情况下获得解决方案。
答案 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;
}
但是,在某些情况下使用反射会有性能缺陷。