Resharper建议我转换以下代码:
Type myType = typeof(FooEntity);
PropertyInfo nameProp = myType.GetProperty("Name");
PropertyInfo valueProp = myType.GetProperty("Id");
using (var dbContext = new MyEntities())
{
foreach (object obj in dbContext.Set(myType))
{
items.Add(new SelectListItem
{
Text = nameProp.GetValue(obj).ToString(),
Value = valueProp.GetValue(obj).ToString(),
});
}
}
要
Type myType = typeof(FooEntity);
PropertyInfo nameProp = myType.GetProperty("Name");
PropertyInfo valueProp = myType.GetProperty("Id");
using (var dbContext = new MyEntities())
{
items.AddRange(from object obj in dbContext.Set(myType)
select new SelectListItem
{
Text = nameProp.GetValue(obj).ToString(),
Value = valueProp.GetValue(obj).ToString(),
});
}
但在接受ReSharper的建议后,我得到了InvalidCastException
System.InvalidCastException未被用户代码
处理消息=无法为类型为“
DbSet<Object>
”的对象的非通用DbSet
创建FooEntity
源=的EntityFramework
StackTrace :(为简洁起见)
ReSharper的建议有什么问题?
答案 0 :(得分:2)
其实我得到了另一个错误:
System.InvalidCastException
:无法为非通用DbSet<Object>
为类型的对象创建DbSet
。
这里的问题是linq表达强制DbSet
实现IEnumerable<object>
这是不可能的,因为它只实现IEnumerable
。证明以下代码正常工作
IEnumerable dbSet = dbContext.Set(myType);
items.AddRange(from object obj in dbSet
select new SelectListItem
{
Text = nameProp.GetValue(obj).ToString(),
Value = valueProp.GetValue(obj).ToString(),
});