2014-01-26 2 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?

Как я могу понять, что идентификатор - это структура или измерение - интерфейс? И Both String и Position являются классом, но String встроен в класс, Position - это пользовательский класс.

ответ

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

вышеупомянутый ответ хорош. BUT Если вы что-то расширяемое, вы можете создать свой собственный Custom Attributes и использовать отражение на этом типе.

Например, вы можете создать атрибут, содержащий способ печати свойств или как их проверить, получить все с отражением.

Мы используем этот способ для создания парсера протокола, где каждый объект определяет порядок в протоколе, длину и валидацию. Но опять же - это может быть за убийство для вас

Смежные вопросы