Я пытаюсь найти атрибут DataMember по свойствам класса. Я могу найти атрибут, если он находится на свойстве, определенном непосредственно в классе. Однако если свойство определено в базовом классе и переопределено, атрибут не найден. Я нашел несколько ссылок, утверждающих, что вы должны использовать System.Attribute для получения этой информации. Ниже приведена прямая цитата из Microsoft .
Вызов ICustomAttributeProvider.GetCustomAttributes для PropertyInfo или EventInfo, когда для параметра true наследования GetCustomAttributes не выполняется иерархия типов. Используйте System.Attribute для наследования пользовательских атрибутов.
Это, кажется, полностью решает проблему при использовании полной структуры. Похоже, это решает проблему ТОЛЬКО «несистемных» атрибутов в Silverlight (протестировано на Silverlight 3.0, 4.0, 5.0). Мой пример кода ниже показывает, что DataMemberAttribute не возвращается, в то время как возвращается другой пользовательский атрибут. Это ошибка или я что-то упустил?
public class CustomAttribute : Attribute
{
}
public class Animal
{
[DataMember(), CustomAttribute()]
public virtual decimal Weight { get; set; }
}
public class Dog : Animal
{
public override decimal Weight { get; set; }
}
public partial class MainPage : UserControl
{
public MainPage()
{
InitializeComponent();
var animalAttributes = Attribute.GetCustomAttributes(typeof(Animal).GetProperties()[0], true);
var dogAttributes = Attribute.GetCustomAttributes(typeof(Dog).GetProperties()[0], true);
//animalAttributes contains 2 entries (DataMember, CustomAttribute)
//dogAttributes contains only 1 entry (CustomAttribute)
}
}