2012-04-25 2 views
5

Ich versuche GetCustomAttributes() zu verwenden, um ein Attribut zu erhalten, das auf einer Eigenschaft definiert ist. Das Problem ist, dass die Eigenschaft eine überschriebene ist und ich nicht herausfinden kann, wie man die überschriebene aus dem Ausdruck extrahiert. Ich kann nur herausfinden, wie man die Basisklasse bekommt.Das Attribut von der überschriebenen Eigenschaft über einen linq erhalten Ausdruck

Hier einige Code

public class MyAttribute : Attribute 
{ 
    //... 
} 

public abstract class Text 
{ 
    public abstract string Content {get; set;} 
} 

public class Abstract : Text 
{ 
    [MyAttribute("Some Info")] 
    public override string Content {get; set;} 
} 

Jetzt versuche ich, die MyAttribute aus der abstrakten Klasse zu erhalten. Aber ich muss es über eine Expression bekommen. Das ist, was ich mit worden:

Expression<Func<Abstract, string>> expression = c => c.Content; 
Expression exp = expression.Body; 
MemberInfo memberType = (exp as MemberExpression).Member; 

var attrs = Attribute.GetCustomAttributes(memberType, true); 

Leider atts endet als leer oben. Das Problem ist, dass menberType für Text.Content anstelle der Abstract.Content Klasse endet. Wenn ich also die Attribute bekomme, gibt es nichts zurück.

Antwort

3

Es funktioniert nicht, da MemberExpression die Überschreibungen ignoriert und die Eigenschaft aus dem Basistyp Text zurückgibt, weshalb Sie Ihr Attribut nicht finden.

Sie können hier über dieses Problem lesen: How to get the child declaring type from an expression?

Jedoch Sie alle Informationen im Ausdruck haben und Sie können Ihr Attribut mit etwas mehr Reflexion (quick and dirty Probe) erhalten:

Expression<Func<Abstract, string>> expression = (Abstract c) => c.Content; 
Expression exp = expression.Body; 
MemberInfo memberType = (exp as MemberExpression).Member; 

var attrs = Attribute.GetCustomAttributes(
expression.Parameters[0].Type.GetProperty(memberType.Name)); 
+0

Danke für den Link zu der anderen Frage. Ich suchte nach etwas ähnlichem, fand das aber nicht. – Jero

+0

Diese Lösung, die du mir gegeben hast, ist die Arbeit, die ich bisher benutzt habe. So schön, dass ich eine unabhängige Unterstützung dafür bekomme :-) Danke – Jero