2014-11-20 3 views
0

Есть ли способ «пометить» свойство в классе, так что, когда я прохожу через свойства класса, я могу выполнить метод, основанный на знаке или немаркированном свойстве.Маркировка свойства для GetProperties

Я не могу этого сделать, проверив свойство property.

испытаний Класс Переберите

public class SomeClass { 
public List<Object> PropertyOne { get; set; } 
public List<Object> PropertyTwo { get; set; } 

public SomeClass() { 
PropertyOne = new List<Object>(); 
PropertyTwo = new List<Object>(); 
} 
} 

Чтение свойства:

SomeClass myObject = new SomeClass(); 
Type myType = myObject.GetType(); 
IList<PropertyInfo> props = new List<PropertyInfo>(myType.GetProperties()); 

foreach (PropertyInfo prop in props) 
{ 
    // If this prop is "marked" -> Execute code below 
} 

Edit: Спасибо вам обоим за большие ответы.

ответ

1

Вот для чего нужны атрибуты. Create your own attribute, примените его к собственности и проверьте, что prop.GetCustomAttribute<MyMarkerAttribute>() не имеет значения.

public class MyMarkerAttribute : Attribute 
{ 

} 

public class SomeClass 
{ 
    // unmarked 
    public List<Object> PropertyOne { get; set; } 

    [MyMarkerAttribute] // marked 
    public List<Object> PropertyTwo { get; set; } 
} 

foreach (PropertyInfo prop in props) 
{ 
    if (prop.GetCustomAttribute<MyMarkerAttribute>() != null) 
    { 
     // ... 
    } 
} 
1

Вы можете использовать атрибуты для этого

public class MyAttribute : Attribute 
{ 

} 

public class SomeClass { 
[MyAttribute] 
public List<Object> PropertyOne { get; set; } 
public List<Object> PropertyTwo { get; set; } 

public SomeClass() { 
PropertyOne = new List<Object>(); 
PropertyTwo = new List<Object>(); 
} 
} 

А затем проверьте атрибуты при переборе свойств, как описано здесь: How to retrieve Data Annotations from code? (programmatically)

public static T GetAttributeFrom<T>(this object instance, string propertyName) where T : Attribute 
{ 
    var attrType = typeof(T); 
    var property = instance.GetType().GetProperty(propertyName); 
    return (T)property .GetCustomAttributes(attrType, false).FirstOrDefault(); 
} 
Смежные вопросы