Oto urywek klasy używać do metod rozszerzenie badań typu:Wywołanie ogólne metodę rozszerzenia bez określania jak wiele rodzajów
class Something
{
[StringLength(100, MinimumLength = 1, ErrorMessage = "Must have between 1 and 100 characters")]
public string SomePublicString { get; set; }
}
Mam następującą metodę rozszerzenia:
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();
}
}
Użycie w teście jednostkowym:
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");
Ta funkcja zwraca test zaliczający (przy użyciu FluentAssertions).
Jednak chciałbym, aby uzyskać połączenie metoda GetCustomAttribute() w wierszu 2 w dół do następujących:
var actual = something.GetCustomAttribute<StringLengthAttribute>(x => x.SomePublicString);
Czy to możliwe? Czy czegoś brakuje? Może mam awarię kofeiny. :(
Huzzah dla zasady pojedynczej odpowiedzialności. – StriplingWarrior
Dzięki. Pierwotnie miałem coś w rodzaju próbki kodu, wyodrębniając odbicie 'PropertyInfo', niestandardowe odbicia atrybutów, i wreszcie, typ jakiego potrzebowałem, ale liczyłem na coś ... szczuplejszego. :-) –
@Dan, często słyszałem, że skarga dotyczyła tego rozwiązania i nigdy naprawdę nie rozumiał skąd pochodzi.Wydaje się być dla mnie bardzo szczupła (dla konsumentów). –