C# 动态检测基类类型对象中打包了哪个子类

C# 动态检测基类类型对象中打包了哪个子类,c#,asp.net,c#-4.0,reflection,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 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);
问题:

此方法如何检测实际出现的类型?假设在每个循环中,我都会浏览列表,所以我不知道每个项目的实际类型(正方形或圆形)

我的实际问题是:


我将不同的子类类型变量打包到基类类型列表中。然后我把这个列表发送给一个方法,在其中我想得到每个类的所有属性。我通过“反射”实现它,但方法.GetProperties()只返回基类的属性,但我还需要派生类的属性。

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

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

如果使用
typeof()
您将对编译时类型执行操作,该类型将始终为
Shape

使用
is
关键字

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