2010-07-20 8 views
22

Ich habe das folgende benutzerdefinierte Attribute, die auf Eigenschaften angewendet werden können:Benutzerdefinierte Attribut auf Eigenschaft - Getting Art und Wert der zurück Eigenschaft

[AttributeUsage(AttributeTargets.Property, AllowMultiple = false)] 
public class IdentifierAttribute : Attribute 
{ 
} 

Zum Beispiel:

public class MyClass 
{ 
    [Identifier()] 
    public string Name { get; set; } 

    public int SomeNumber { get; set; } 
    public string SomeOtherProperty { get; set; } 
} 

wird es auch sein, andere Klassen, denen das Identifikatorattribut zu Eigenschaften unterschiedlichen Typs hinzugefügt werden könnte:

public class MyOtherClass 
{ 
    public string Name { get; set; } 

    [Identifier()] 
    public int SomeNumber { get; set; } 

    public string SomeOtherProperty { get; set; } 
} 

Ich muss dann in der Lage sein, diese Informationen in meiner Verbrauchsklasse zu bekommen. Zum Beispiel:

public class TestClass<T> 
{ 
    public void GetIDForPassedInObject(T obj) 
    { 
     var type = obj.GetType(); 
     //type.GetCustomAttributes(true)??? 
    } 
} 

Was ist der beste Weg, um darüber zu gehen? Ich muss den Typ des Feldes [Identifier()] (int, string, etc ...) und den tatsächlichen Wert, offensichtlich basierend auf dem Typ.

Antwort

30

So etwas wie die folgenden ,, wird dies nur die erste Eigenschaft verwenden, es kommt accross, dass das Attribut hat natürlich Sie es auf mehr als einem Ort könnte ..

public object GetIDForPassedInObject(T obj) 
    { 
     var prop = typeof(T).GetProperties(BindingFlags.Public | BindingFlags.Instance) 
        .FirstOrDefault(p => p.GetCustomAttributes(typeof(IdentifierAttribute), false).Count() ==1); 
     object ret = prop !=null ? prop.GetValue(obj, null) : null; 

     return ret; 
    } 
+0

Dank - kann‘ t verwenden "prop" innerhalb der Lambda in FirstOrDefault, aber ich habe es sortiert :-) – Alex

+0

Ahh ja, schrieb es in Notizblock ;-) behoben. –

+1

Ich habe meine Eigenschaft mit [Identifier()] markiert, aber die .GetProperties() gibt alle anderen Eigenschaften zurück, AUSSER diesem ?! Mein Attribut scheint es zu verbergen? – Alex

2
public class TestClass<T> 
{ 
    public void GetIDForPassedInObject(T obj) 
    { 
     PropertyInfo[] properties = 
      obj.GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance);    

     PropertyInfo IdProperty = (from PropertyInfo property in properties 
          where property.GetCustomAttributes(typeof(Identifier), true).Length > 0 
          select property).First(); 

     if(null == IdProperty) 
      throw new ArgumentException("obj does not have Identifier."); 

     Object propValue = IdProperty.GetValue(entity, null) 
    } 
} 
Verwandte Themen