2016-08-29 3 views
1

Mit Liste der Objekte:C# erhalten Eigenschaft mit bestimmten Attribut aus der Liste Objekte

List<ConfigurationObjectBase> ObjectRegistry; 

unter Attribut und einige der oben genannten Objekte mit diesem Attribut versehen:

[AttributeUsage(AttributeTargets.Property, Inherited = true, AllowMultiple = true)] 
public sealed class PropertyCanHaveReference : Attribute 
{ 
    public PropertyCanHaveReference(Type valueType) 
    { 
     this.ValueType = valueType; 
    } 

    public Type ValueType { get; set; } 
} 

Nun, ich möchte um alle Objekte zu finden, deren Eigenschaft mit diesem Attribut versehen ist.

Code unten Probieren, scheint ich tue, falsch:

List<ConfigurationObjectBase> tmplist = ObjectRegistry.Where(o => (o.GetType().GetProperties().Where(p => p.GetCustomAttributes(typeof(PropertyCanHaveReference), true).Length > 0))); 

Vielen Dank für Ihre Zeit.

+3

Sollte nicht die zweite 'Where' sein' Any'? –

+0

Auf den ersten Blick scheint Ihr Code richtig zu sein (obwohl Sie vielleicht bei den Konventionen bleiben und die Attributklasse 'PropertyCanHaveReferenceAttribute' aufrufen). Was geht eigentlich "falsch"? Erhalten Sie Fehlermeldungen oder keine Ergebnisse, wo Sie welche erwarten würden? Bitte geben Sie Beispielobjekte an, die nicht funktionieren oder ein [minimales, vollständiges und verifizierbares Beispiel] (http://stackoverflow.com/help/mcve) –

Antwort

1

Es scheint, dass Sie einige Syntaxfehler in der Codezeile haben, die Sie anzeigen. Und Sie können einige Where/Count Kombinationen zu Any() konvertieren. Dies funktioniert für mich:

List<ConfigurationObjectBase> tmplist = 
     ObjectRegistry.Where(o => o.GetType().GetProperties().Any(p => 
       p.GetCustomAttributes(typeof(PropertyCanHaveReference), true).Any())).ToList(); 

So sind Sie für alle Objekte filtern, die jede Eigenschaft haben, dass jede Attribut des Typs hat.

Sie können auch die generische GetCustomAttribute<T>() Methode verwenden:

List<ConfigurationObjectBase> tmplist = 
     ObjectRegistry.Where(o => o.GetType().GetProperties().Any(p => 
        p.GetCustomAttribute<PropertyCanHaveReference>(true) != null)).ToList(); 

Bitte betrachten Sie Ihre Attributklasse zu nennen nach Konventionen PropertyCanHaveReferenceAttribute.

0

Hier ist ein Code, um die Liste der Objekt zu erhalten, die es Eigenschaften dekoriert mit benutzerdefinierten Attribut hat:

 List<ConfigurationObjectBase> tmplist = ObjectRegistry.Where(o => 
      (o.GetType().GetProperties(System.Reflection.BindingFlags.Public | 
            System.Reflection.BindingFlags.NonPublic | 
      System.Reflection.BindingFlags.Instance).Where(
      prop => Attribute.IsDefined(prop, typeof(PropertyCanHaveReference)))).Any()).ToList(); 

Ihr Code würde nur öffentliche Eigenschaften erhalten, die eingerichtet wurde. Code oben wird sowohl öffentliche als auch nicht-öffentliche erhalten.

0

sollten Diese System.Type-Extension-Methode arbeiten:

public static IEnumerable<PropertyInfo> GetPropertiesWithAttribute<TAttribute>(this Type type) where TAttribute : Attribute 
{ 
    var properties = type.GetProperties(); 
    // Find all attributes of type TAttribute for all of the properties belonging to the type. 
    foreach (PropertyInfo property in properties) 
    { 
     var attributes = property.GetCustomAttributes(true).Where(a => a.GetType() == typeof(TAttribute)).ToList(); 
     if (attributes != null && attributes.Any()) 
     { 
      yield return property; 
     } 
    } 
} 
Verwandte Themen