C# 当试图成为通用型时出现铸造问题/';自由输入';|ASP MVC
问题 有没有一种方法可以在C#(在helper类或其他类中)中只定义一次方法,而不知道返回哪种类型 详细解释 我得到以下错误:C# 当试图成为通用型时出现铸造问题/';自由输入';|ASP MVC,c#,asp.net,asp.net-mvc,C#,Asp.net,Asp.net Mvc,问题 有没有一种方法可以在C#(在helper类或其他类中)中只定义一次方法,而不知道返回哪种类型 详细解释 我得到以下错误: Unable to cast object of type 'System.Data.Objects.ObjectQuery`1[WerkStageNu.Vacancies]' to type 'System.Linq.IQueryable`1[WerkStageNu.Models.IFilteredEntities]'. 无法强制转换类型为的对象 System.Da
Unable to cast object of type 'System.Data.Objects.ObjectQuery`1[WerkStageNu.Vacancies]' to type 'System.Linq.IQueryable`1[WerkStageNu.Models.IFilteredEntities]'.
无法强制转换类型为的对象
System.Data.Objects.ObjectQuery1[WerkStageNu.expansions]'
打字
'System.Linq.IQueryable
1[WerkStageNu.Models.IFilteredEntities]'
我有一个ListingsController,它在数据库中搜索我当前的空缺:
public ActionResult Search(int? page, string branchid, string hoursago, string jobtypeid, string educationlevelid, string careerlevelid)
{
string searchResult = string.Empty;
const int pageSize = 10;
IQueryable<IFilteredEntities> selectedListings = (IQueryable<IFilteredEntities>)Repository.Instance._entities.Vacancies.AsQueryable();
Dictionary<string, string> filterParams = new Dictionary<string, string>() {
{"branchid", branchid}, {"hoursago", hoursago}, {"jobtypeid", jobtypeid}, {"educationlevelid", educationlevelid}, {"careerlevelid", careerlevelid}};
selectedListings = FilterByIDHelper.Filter(selectedListings, filterParams);
var paginatedDinners = new PaginatedList<Vacancies>(((IQueryable<Vacancies>)selectedListings).ToList(), page ?? 0, pageSize);
return View("Index", paginatedDinners);
}
当然,在接口中实现默认情况下未实现的方法。在我的界面中,我有:
interface IFilteredEntities
{
string EducationLevelID { get; set; }
string BrancheID { get; set; }
string CareerLevelID { get; set; }
string JobTypeID { get; set; }
Branches Branches { get; set; }
DateTime? DateOfCreation { get; set; }
CareerLevels CareerLevels { get; set; }
JobTypes JobTypes { get; set; }
EducationLevels EducationLevels { get; set; }
}
为了方便起见,我上传了两个助手类PaginatedList和FilterCriteriaHelper和
现在,将执行实际筛选的方法放在另一个帮助器类中:FilterByIDHelper.cs
public static IQueryable<IFilteredEntities> Filter(IQueryable<IFilteredEntities> collection, Dictionary<string, string> filterParams)
{
if (filterParams.ContainsKey("branchid")) collection = FilterByBranchId(collection, filterParams["branchid"]);
if (filterParams.ContainsKey("hoursago")) collection = FilterByHoursAgo(collection, filterParams["hoursago"]);
if (filterParams.ContainsKey("jobtypeid")) collection = FilterByJobTypeId(collection, filterParams["jobtypeid"]);
if (filterParams.ContainsKey("educationlevelid")) collection = FilterByEducationLevelId(collection, filterParams["educationlevelid"]);
if (filterParams.ContainsKey("careerlevelid")) collection = FilterByCareerLevelId(collection, filterParams["careerlevelid"]);
return collection;
}
public static IQueryable<IFilteredEntities> Filter(IQueryable<IFilteredEntities> collection, Dictionary<string, string> filterParams)
{
if (filterParams.ContainsKey("branchid")) collection = FilterByBranchId(collection, filterParams["branchid"]);
if (filterParams.ContainsKey("hoursago")) collection = FilterByHoursAgo(collection, filterParams["hoursago"]);
if (filterParams.ContainsKey("jobtypeid")) collection = FilterByJobTypeId(collection, filterParams["jobtypeid"]);
if (filterParams.ContainsKey("educationlevelid")) collection = FilterByEducationLevelId(collection, filterParams["educationlevelid"]);
if (filterParams.ContainsKey("careerlevelid")) collection = FilterByCareerLevelId(collection, filterParams["careerlevelid"]);
return collection;
}
我希望我没有忘记任何信息,但我已经盯着这个代码看了一段时间了。可能会忘记一段关系或其他事情,如果我忘记了,就直接问我:)
----------------------------------------------------------------
评论后编辑
----------------------------------------------------------------
哦,废话,别担心这部分,我忘了作为一个可计算的部分,仍然在使用AsQueryable。在我看来,这是一个协方差与逆变的问题。基本上,
IQueryable
不是IQueryable
的子类型,即使它实现了iFilteredentity。因此,带有强制转换的行会导致运行时错误。因此,与其做演员,不如尝试以下方法:
IEnumerable<IFilteredEntities> selectedListings =
Repository.Instance._entities.Vacancies.AsQueryable()
.OfType<IFilteredEntities>();
IEnumerable selectedListings=
Repository.Instance.\u entities.dispositions.AsQueryable()
.of type();
这样做的目的是将集合的每个元素投影到IFilteredEntities类型
另一种选择是重写筛选方法,使其使用泛型,如下所示:
public static IEnumerable<T> Filter<T>(
IEnumerable<T> collection, IDictionary<string, string> filterParams)
where T : IFilteredEntities
{
...
}
公共静态IEnumerable筛选器(
IEnumerable集合、IDictionary筛选器参数)
其中T:iFilteredenties
{
...
}
然后,这将允许您传入包含从IFilteredEntities派生的任何类型的集合,并返回相同类型的集合。如果您使用的是C#3,那么如果类型参数可以由编译器隐式确定,那么您甚至不必指定它。您在这个问题上付出的全部努力获得了额外的分数!非常感谢,在回复中付出同样努力的人将获得加分:)。嗯,什么?我想不是:)。也许你也应该把这个标记为c。这不仅仅是针对ASP.NETMVC的。我认为,Mastermind的意思是monster.com:)我已经在底部编辑了我的文章,其中包含了我在实现此功能后遇到的问题。它确实通过了这一行,但下一部分是:).Wups,还有一个小的附加内容要更改:AsQueryable()为AsEnumerable()。
IEnumerable<IFilteredEntities> selectedListings =
Repository.Instance._entities.Vacancies.AsQueryable()
.OfType<IFilteredEntities>();
public static IEnumerable<T> Filter<T>(
IEnumerable<T> collection, IDictionary<string, string> filterParams)
where T : IFilteredEntities
{
...
}