2009-12-02 6 views
12

Nehmen Sie diese beiden Code Dinge:C#: Was ist der Unterschied zwischen TypeDescriptor.GetAttributes() und GetType(). GetCustomAttributes?

instance.GetType() 
.GetCustomAttributes(true) 
.Where(item => item is ValidationAttribute); 

Und

TypeDescriptor.GetAttributes(instance) 
.OfType<ValidationAttribute>(); 

Wenn die Klasse wie folgt aussieht:

[RequiredIfOtherPropertyIsNotEmpty("State", "City", ErrorMessage = ErrorDescription.CreateAccount_CityRequiredWithState)] 
[RequiredIfOtherPropertyIsNotEmpty("State", "Address1", ErrorMessage = ErrorDescription.CreateAccount_Address1RequiredWithState)] 
public class ManagePostModel 
{ 
    ... 
} 

Wo RequiredIfOtherPropertyIsNotEmpty ein ValidationAttribute und hat AllowMultiple = true.

Der erste gibt zwei Attribute zurück, der zweite gibt einen zurück.

Was ist der Unterschied, der das verursachen würde?

+0

Siehe auch [typedescriptor-getproperties-vs-type-getproperties] (http://stackoverflow.com/questions/1402239/typedescriptor-getproperties-vs-type-getproperties) – nawfal

Antwort

9

Von the MSDN page on TypeDescriptor.GetAttributes:

Um mehrere Instanzen eines AttributeUsageAttribute.AllowMultiple Attribut aus dem AttributeCollection zurückzukehren, muss Ihr Attribut die Attribute.TypeId Eigenschaft außer Kraft setzen.

die allgemeine Frage zu beantworten: „Was ist der Unterschied?“: Die von TypeDescriptor zurückgegebenen Werte können zur Laufzeit verlängert werden, während der in Type nicht. Die MSDN-Seite, mit der ich verlinkt bin, erklärt mehr.

Wenn Sie diese Art von Laufzeit-Erweiterung nicht benötigen und die Art, wie TypeDescriptor mehrere Attribute behandelt, ein Problem ist, sind Sie wahrscheinlich besser dran mit Type.GetCustomAttributes.

+1

So kann Type.GetCustomAttributes keine Attribute erhalten, die hinzugefügt werden zur Laufzeit (ich meine Attribute hinzugefügt mit TypeDescriptor.AddAttributes (...)) richtig? – Gintama

+0

'TypeDescriptor.GetAttributes (...)' ist nicht verfügbar für mindestens 'netstandard1.3' und' netstandard1.4' – manuc66

Verwandte Themen