2014-01-26 154 views
1

區分類屬性類型我有一個矩形類通過反射

public class Rectangle : Base, IRectangle 
{ 
    public IDimension dimension { get; set; } 
    public Position position { get; set; } 
    public String color { get; set; } 
    public int ID { get; set; } 

    public override String ToString() 
    { 
     return base.ToString(this); 
    } 
} 

是否有任何的方式,通過反射類型的上Rectangle類定義的特性的區別?

我該怎麼理解ID是struct還是dimension是Interface?並且String和Position都是類,但String是在類中構建的,Position是Custom類。

回答

4

您可以使用此屬性:

typeof(T).IsPrimitive 

要檢查如果一個類型是原始的還是非原始

這一個:

typeof(T).IsInterface 

要檢查一個類型的接口或不。

這是你如何檢查是一種類型是一個結構或不:

typeof(T).IsValueType 

如果你是真正的唯一的「純」結構(一般不只是值類型),然後看:

typeof(T).IsValueType && !typeof(T).IsEnum; 
3
var prop = typeof(Rectangle).GetProperty("ID"); 
if(prop.PropertyType.IsValueType) 
{ 
    .. 
} 

prop = typeof(Rectangle).GetProperty("dimension"); 
if(prop.PropertyType.IsInterface) 
{ 
    ... 
} 

prop = typeof(Rectangle).GetProperty("color"); 
if(prop.PropertyType.IsClass) 
{ 
    ... 
} 

正如你可能已經注意到Type類包含幾個屬性,你可以確定類型是否是值類型,或者接口或類等

要確定類的類型是否爲built-in型或custom類型,我想你可以檢查類型的Assembly是否從GAC (Global assembly cache)加載或not.It不是最好的解決辦法,但我不知道另一種方式。

if(prop.PropertyType.Assembly.GlobalAssemblyCache) 
{ 
    // built-in type.. 
} 
1

以上答案都不錯。 但是 如果您可擴展的東西,您可以創建自己的自定義Custom Attributes並在該類型上使用反射。

例如,您可以創建包含如何打印屬性或如何驗證它們的屬性,使用反射來獲取所有屬性。

我們用這種方式來創建協議分析器,其中每個屬性,我們在協議中,長度和驗證定義訂單 - 但是 - 這可能是在殺手你