我创建了一个通用下拉列表,用于我的控制器:
GenericDropDownList("myDropDown");
private void GenericDropDownList(string dropdownName, object selectedDepartment = null) {
var dropdownQuery = unitOfWork.SalesRepository.Get(orderBy: q => q.OrderBy(d => d.FirstName));
ViewData[dropdownName] = new SelectList(dropdownQuery, "LastName", "LastName", selectedDepartment);
}
这似乎工作正常。我尝试的是使unitOfWork.TestRepository
动态,以便我可以使用函数中的每个可用存储库:
GenericDropDownList("myDropDown", SalesRepository);
private void GenericDropDownList(string dropdownName, object repository, object selectedDepartment = null) {
var dropdownQuery = repository.Get(orderBy: q => q.OrderBy(d => d.FirstName));
ViewData[dropdownName] = new SelectList(dropdownQuery, "LastName", "LastName", selectedDepartment);
}
上述方法无效。我收到以下错误:
错误CS1061'对象'不包含' Get'的定义和不 扩展方法'获取'接受类型'对象'的第一个参数。 可以找到
是否可以将下拉列表视为我想要的动态?
答案 0 :(得分:0)
如果您想要动态对象,请使用dynamic
类型。
或者尝试将其转换为合适的类型:
(repository as type).Get(...)
答案 1 :(得分:0)
正确的方法是让所有存储库都使用常用方法实现公共接口。
例如,您可以创建界面IRepository
或IRepository<TSource>
,如果您希望它更具体一点。
问题是TSource
应根据您的预期代码设置FirstName
属性。
您确定所有存储库都有FirstName
属性的实体吗?
如果答案是否,那么你就无法创建这样的通用方法(你需要重新定义你的逻辑,或创建一个具有此属性的实体的特定接口,但是你无法传递任何存储库,只传递实现此接口的存储库。)
如果答案是是,那么您可以为所有源实体(例如BaseEntity
)创建基类,这将具有FirstName
财产。
假设答案是肯定的,那么您可以将方法的签名更改为:
private void GenericDropDownList(string dropdownName, IRepository<TSource> repository, object selectedDepartment = null) where TSource : BaseEntity
然后您就可以调用它:
GenericDropDownList("myDropDown", SalesRepository); //SalesRepository should implement IRepository<Sale>, where Sale : BaseEntity
答案 2 :(得分:0)
类app.log.lck
没有app.log.1
方法,因此无法编译它。
使用FileHandler
将解决这个问题,因为object
会在运行时解析,虽然性能成本很高,如果在运行时不存在.Get
,则存在运行时错误的风险。< / p>
我认为最好的方法是使用界面:
dynamic
使用Entity Framework时,可以使用分部类将此接口强加于Repository类:
.Get
一个问题是接口可以不定义.Get
等属性,因此您必须为此定义方法,或使用private void GenericDropDownList(string dropdownName, IRepository repository, object selectedDepartment = null)
{
// ...
}
排序位。