Ecco un frammento di una classe che uso per prove di tipo metodi di estensione:Chiamare un metodo di estensione generica senza specificare come molti tipi
class Something
{
[StringLength(100, MinimumLength = 1, ErrorMessage = "Must have between 1 and 100 characters")]
public string SomePublicString { get; set; }
}
Ho la seguente metodo di estensione:
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();
}
}
utilizzo in una prova di unità:
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");
Ciò restituisce un test di passaggio (usando FluentAssertions).
Tuttavia, mi piacerebbe ottenere il metodo di chiamata a GetCustomAttribute() in linea 2 fino alla seguente:
var actual = something.GetCustomAttribute<StringLengthAttribute>(x => x.SomePublicString);
è possibile? Mi sto perdendo qualcosa? Forse sono in un incidente con la caffeina. :(
Huzzah per il principio di responsabilità unica. – StriplingWarrior
Grazie. Inizialmente avevo qualcosa come il tuo esempio di codice, rompendo il riflesso 'PropertyInfo', i riflessi degli attributi personalizzati e infine, il tipo che volevo, ma speravo in qualcosa ... più snello. :-) –
@Dan, ho sentito spesso che la denuncia si applicava a questa soluzione e non ho mai veramente capito da dove proviene.Sembra abbastanza magra per me (per i consumatori). –