我在設置屬性類的值時使用PropertyInfo.SetValue設置屬性的值時遇到了問題。 這段代碼用於單元測試,我想用它來僞裝實體中的IDbSets。使用反射來設置接口成員
public static void AddFakeDbSets<T>(this Mock<T> obj) where T : class
{
var iDbSets = typeof(T).GetProperties().Where(p =>
p.PropertyType.IsGenericType == true &&
p.PropertyType.GetGenericTypeDefinition().Name.StartsWith("IDbSet"));
Type baseType = typeof(FakeDbSet<>);
foreach (var iDbSet in iDbSets)
{
if (iDbSet.GetValue(obj.Object) == null)
{
var genericType = baseType.MakeGenericType(iDbSet.PropertyType);
var concreteObject = Activator.CreateInstance(genericType);
iDbSet.SetValue(obj.Object, concreteObject);
}
}
}
具體地說它與以下錯誤崩潰在iDbSet.SetValue():
Object of type 'lnEcommAPI.Tests.FakeDbSet
1[System.Data.Entity.IDbSet
1[LNWebServicesRepository.WhatsNew]]' cannot be converted to type 'System.Data.Entity.IDbSet`1[LNWebServicesRepository.WhatsNew]'.
對於未來的讀者:答案修復了崩潰,但Moq仍然在分配值的方式。 – 2014-09-19 15:30:32