5

Type 拡張メソッドのテストに使用するクラスのスニペットを次に示します。

class Something
{
  [StringLength(100, MinimumLength = 1, ErrorMessage = "Must have between 1 and 100 characters")]
  public string SomePublicString { get; set; }
}

次の拡張メソッドがあります。

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();
  }
}

単体テストでの使用:

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");

これは、合格したテストを返します (FluentAssertions を使用)。

ただし、2 行目の GetCustomAttribute() へのメソッド呼び出しを次のように取得したいと思います。

var actual = something.GetCustomAttribute<StringLengthAttribute>(x => x.SomePublicString);

これは可能ですか?何か不足していますか?多分私はカフェインのクラッシュにいます。:(

4

2 に答える 2

7

いいえ、型引数をすべて指定するか、まったく指定しないかのどちらかです。「部分的な」型推論はありません。

ただし、これを回避する方法の 1 つは、ジェネリック クラスのインスタンスを返す単一の型引数を持つ 1 つのジェネリック メソッドを用意し、それに対して型推論を使用して残りを処理することです (またはその逆)。この場合、とにかく、属性の取得を残りから分離するのが実際には最善かもしれません:

something.GetPropertyAttributes(x => x.SomePublicString)
         .FirstAttribute<StringLengthAttribute>();

Tここで、最初のメソッド呼び出しはand - を推論し、単に anをTProperty返し、 /呼び出しを行うだけです。(自分で呼び出すのが非常に簡単であることを考えると、必要ないと判断することさえあるかもしれません。)IEnumerable<Attribute>FirstAttributeOfTypeFirstOrDefaultFirstAttributeOfTypeFirstOrDefault

于 2013-04-04T16:05:15.750 に答える
3

型引数の一部を推論することはできませんが、すべてを推論することはできません。

次のいずれかを実行できます。

  1. すべての総称引数を指定してください。

  2. すべてのジェネリック引数が推論できることを確認してください。(常に可能であるとは限りません。または、推論を可能にするために必要な妥協が望ましくない場合もあります。)

  3. メソッドを複数のメソッドに分割して、1 つのメソッドがジェネリック引数を推測し、1 つのメソッドが推測しないようにします。

于 2013-04-04T16:01:46.953 に答える