私はこれを持っています:
public void AssertReadWorks<T>(
IRepository<T> repository,
T entity,
Expression<Func<T, T, bool>> keyComparer) where T : class
{
entity = repository.GetAll().Single(x => x.Id == entity.Id);
}
[TestMethod]
public void ReadTest_DataFieldGroup()
{
AssertReadWorks(
_unitOfWork.DataFieldSetRepository,
new DataFieldSet { Label = "test", Title = "test" },
(a, b) => a.Id == b.Id);
}
T に Id プロパティがあることがわかっていないため、これはコンパイルされません。keyComparer
パラメータは現在使用されていないことに注意してください。keyComparer パラメーター (または別の適切なパラメーター) を使用して、次の述語を動的に生成したいと考えていますSingle()
。
Expression<Func<T, bool>> keyComparingPredicate =
x => a predicate that compares the key of x with the key of `entity`;
entity = repository.GetAll().Single(keyComparingPredicate);
ポイントは、すべての T が Id プロパティを持つわけではなく、異なる名前を持つものもあれば、複合キーを持つものもあるということです。AssertReadWorks()
ジェネリックでない場合、オリジナルは正常に機能します。問題は、一般的なケースで述語を動的に構築することです。keyComparer パラメーターとは異なる何かで実行できる場合は、問題ありません。
何か案は?:)