Ich habe eine Klasse Bar wie folgt aus:Reflektieren über die Eigenschaft, Attribute zu erhalten. Wie zu tun, wenn sie woanders definiert sind?
class Foo : IFoo {
[Range(0,255)]
public int? FooProp {get; set}
}
class Bar : IFoo
{
private Foo foo = new Foo();
public int? FooProp { get { return foo.FooProp; }
set { foo.FooProp= value; } }
}
Ich brauche das Attribut [Range (0255)] reflektieren NUR auf dem Grundstück Bar.FooProp zu finden. Ich meine, die Requisite ist in der Klasseninstanz (.. new Foo()) dekoriert, nicht in der Klasse, wenn ich gerade analysiere. Infact Bar.FooProp hat keine Attribute
EDIT
I Attribute auf die Schnittstelle der Definition bewegt, also was ich tun muss, ist die geerbten Schnittstellen Parsen sie zu finden. Ich kann tun, weil Bar Klasse IFoo.In diesem speziellen Fall implementieren müssen, ich habe das Glück, aber das Problem bleibt, wenn ich keine Schnittstellen ... Ich Note für das nächste Mal
foreach(PropertyInfo property in properties)
{
IList<Type> interfaces = property.ReflectedType.GetInterfaces();
IList<CustomAttributeData> attrList;
foreach(Type anInterface in interfaces)
{
IList<PropertyInfo> props = anInterface.GetProperties();
foreach(PropertyInfo prop in props)
{
if(prop.Name.Equals(property.Name))
{
attrList = CustomAttributeData.GetCustomAttributes(prop);
attributes = new StringBuilder();
foreach(CustomAttributeData attrData in attrList)
{
attributes.AppendFormat(ATTR_FORMAT,
GetCustomAttributeFromType(prop));
}
}
}
}
Tatsächlich spiegelt der Schlüssel "inside" die Get/Set-Methode wider. Ich weiß nicht, ob es eine Möglichkeit gibt, den Return-Parameter zu verstehen, ist ein Aufruf einer Instanz-Methode. –
Wenn Sie * innerhalb * der get/set sind, dann kennen Sie den Typ ... benutzen Sie einfach den bekannten Typ ... ? –
mhh ... ich dachte, die Attribute der Schnittstellendefinition zu verschieben. Also reflektiere ich direkt über die geerbten Attribute nach Interface, nicht über die implementierten Eigenschaften. Könnte es sein, Marc? –