日期:2014-05-19  浏览次数:20882 次

关于获取类的实际类型的问题
public   abstract   class   A
{
//....内容省略
}

public   class   B   :   A
{
//....内容省略
}

public   class   C   :   A
{
//....内容省略
}

public   abstract   class   D
{
public   void   MethodTest(A   Ains)
{
//....内容省略
}
}

public   class   E   :   D
{
//...内容省略
}

public   class   F   :   D
{
//...内容省略
}

在上面提供的类中,B、C都是继承抽象类A,E、F继承抽象类D。现在的D中有个方法MethodTest,它的一个参数是抽象类A,我现在实例化类E(或者F),我调用MethodTest方法,传入的参数值可能是B或者是C的实例,现在的问题是,我在MethodTest方法内部,我怎么得到传入的参数值具体的类型(有可能是B,也有可能是C)

------解决方案--------------------
if( Ains is B )
if( Ains is C )
------解决方案--------------------
ains.GetType().BaseType

不过这种在MethodTest需要依靠判断子类类型来执行的操作的设计不怎么好,
可能可以把这些不同的部分定义成A的方法放到ABC的类体系里面去做。
------解决方案--------------------
to runrunrun(农妇、山泉、有点田) :
不能这样去遍历,因为上面的B、C类是不定的,在MethodTest方法体内我也许根本不知道B、C类是类
========
为什么这样处理不行?
这样就简单还最直接呢

public void MethodTest(A Ains)
{
if(Ains is B) {
Console.Write( "hello, i 'm B class ");
// ...
}
else if(Ains is C) {
Console.Write( "hello, i 'm C class ");
// ...
} else{
throw new Exception( "in fact, this case should never occurs. ");
}
}
------解决方案--------------------
Ains.GetType()
------解决方案--------------------
public void MethodTest(A Ains)
{
if (a is B)
{}
else if (a is C)
{}

//或
if (a.GetType()==typeof(B))
{}
else if (a.GetType() == typeof(C))
{}
}
------解决方案--------------------
lz想要知道传入的参数值具体的类型干嘛?
------解决方案--------------------
GetType()
的确,对于一个好的设计来说,你根本不需在调用时知道具体是哪各子类,所有相关工作应该在子类中实现。