0

私がやろうとしているのは、AutoFixture と Moq を使用してリポジトリを作成することを一般化することです。リストに偽のレコードを追加する「add」というメソッドがあります。リストはレコードと呼ばれ、クラスに対してグローバルです。一般的な M は、嘲笑されるモデルです。メソッドは「this」を返すため、メソッドをチェーンできます。

public Repo<M> add(string prop, string val) {
    var a = fixture.Build<M>().With(m => m.GetProperty(prop), val).Create();
    records.Add(a);
    return this;
}

拡張クラスを使用します(これはSOの検索で見つかりました):

public static class MyExtensions
{
    public static object GetProperty<T>(this T obj, string name) where T : class
    {
        Type t = typeof(T);
        return t.GetProperty(name).GetValue(obj, null);
    }
}

私が得ているエラーは、「Ploeh.AutoFixture.dll で ArgumentException が発生しました」です。

私の質問は次のとおりです。コンパイル時にモデルが不明な場合、メソッドのパラメーターとして汎用オブジェクトのプロパティを渡すにはどうすればよいですか?

4

2 に答える 2

4

WithメソッドにはExpression<Func<T, TProperty>>パラメーター notが必要PropertyInfoです。

メソッドをstring の代わりにaddtakeに変更できます。Expression<Func<T, TProperty>>

public Repo<M> add<T>(Expression<Func<M, T>> propertyPicker, T val) 
{
   var a = fixture.Build<M>().With(propertyPicker, val).Create();
   records.Add(a);
   return this;
}

これは使用法です:

add(foo => foo.Name, "abc");
于 2015-09-11T17:45:17.010 に答える