动态检测在基类类型对象中打包的子类

时间:2014-07-08 07:57:59

标签: c# asp.net c#-4.0 reflection

我有一个方法,它获取基类类型的变量,但我将子类的变量传递给此方法。

简单示例:

public class Shape {
    public string Color {get;set;}    
}

public class Square : Shape {
    public int Corners {get;set;}    
}

public class Circle : Shape {
    public int Radius {get;set;}    
}

某些方法如:

public void GetDetails(Shape item){
    // do something        
}

然后我将子类对象传递给这个方法:

var sq = new Square();
var cir = new Circle();
var corners = GetDetails(sq);
var radius = GetDetails(cir);

问题:

该方法如何检测实际出现的类型?假设在foreach循环中我通过List,所以我不知道每个项目的确是什么类型(Square或Circle)。

我的实际问题是:

我将不同的子类类型变量打包到基类类型的List中。然后我将此List发送到一个方法,在其中我想获得每个类的所有属性。我通过“reflection”实现它,但是方法.GetProperties()只返回基类的属性,但我也需要派生的属性。

2 个答案:

答案 0 :(得分:2)

您应该使用GetType()来获取对象的动态(实际)类型:

public void GetDetais(Shape item)
{
    var properties = item.GetType().GetProperties();
}

如果您使用typeof(),您将采用编译时类型,该类型始终为Shape

答案 1 :(得分:1)

使用is关键字

if (item is Square) {...};
if (item is Circle) {...};