Hier spezifiziert ist ein Ausschnitt aus einer Klasse I für die Prüfung Typ Erweiterungsmethoden verwenden:eine generische Erweiterungsmethode aufrufen, ohne so viele Arten
class Something
{
[StringLength(100, MinimumLength = 1, ErrorMessage = "Must have between 1 and 100 characters")]
public string SomePublicString { get; set; }
}
Ich habe folgende Erweiterungsmethode:
public static class TypeExtensions
{
public static TAttributeType GetCustomAttribute<T, TAttributeType, TProperty>(this T value, Expression<Func<T, TProperty>> propertyLambda, bool inherit = false)
{
var type = typeof(T);
var member = (MemberExpression)propertyLambda.Body;
var propertyInfo = (PropertyInfo)member.Member;
var customAttributes = propertyInfo.GetCustomAttributes(typeof(TAttributeType), inherit);
return customAttributes.OfType<TAttributeType>().FirstOrDefault();
}
}
Verwendung in einem Komponententest:
1: var something = new Something();
2: var actual = something.GetCustomAttribute<Something, StringLengthAttribute, string>(x => x.SomePublicString);
3: actual.MinimumLength.Should().Be(1);
4: actual.MaximumLength.Should().Be(100);
5: actual.ErrorMessage.Should().Be("Must have between 1 and 100 characters");
Dies gibt zurück ein bestandener Test (unter Verwendung von FluentAssertions).
aber ich möchte den Methodenaufruf zu GetCustomAttribute() in Zeile 2 bis auf die folgenden erhalten:
var actual = something.GetCustomAttribute<StringLengthAttribute>(x => x.SomePublicString);
Ist das möglich? Fehle ich etwas? Vielleicht bin ich auf einen Koffein-Crash. :(
Huzzah für das Prinzip der einheitlichen Verantwortung. – StriplingWarrior
Danke. Ich hatte ursprünglich etwas wie Ihr Code-Beispiel, die "PropertyInfo" -Reflexion, benutzerdefinierte Attribut-Reflexionen und schließlich den Typ, den ich wollte, aber ich hoffte auf etwas ... schlanker. :-) –
@Dan, ich habe oft gehört, dass diese Beschwerde auf diese Lösung angewendet wurde und habe nie wirklich verstanden, woher sie kommt.Scheint ziemlich mager zu mir (für die Verbraucher). –