我有以下情况:
public JsonResult ChangeFilterList(int option)
{
var data = new[] { new { Text = "Unknown option", Value = -1 } };
switch (option)
{
case 2: data = _departmentnameRepository.All.Select(x => new { Text = x.DeptName, Value = x.Id }).ToArray();
break;
case 3: data = Session["projectid"] == null
? _assetSequenceRepository.All.Select(x => new { Text = x.AssetShotName, Value = x.Id }).ToArray()
: _assetSequenceRepository.FindBy(p => p.ProjectId == (int)Session["projectid"]).Select(x => new { Text = x.AssetShotName, Value = x.Id }).ToArray();
break;
default: data = _userRepository.All.Select(x => new { Text = x.DisplayName, Value = x.UserID }).ToArray();
break;
}
return Json(data, JsonRequestBehavior.AllowGet);
}
case2
和default
看上去很不错,但抱怨的情况下3(有条件)说:Cannot implicitly convert type 'AnonymousType#1[]' to 'AnonymousType#2[]'
。?:
由于我已经提供了匿名用户的蓝图,因此应该无法确定类型var data = new[] { new { Text = "Unknown option", Value = -1 } };
。
解决方案:
@Darin Dimitrov的答案很好,但我想对匿名类型进行一些测试(简单的案例总是需要它)。正如@道格拉斯(Douglas)所怀疑的:我assetSequenceRepository
提供的id
是long
和匿名Value
赞成int
不提供的long
。由于C#编译器没有隐式转换long
为int
,所以出现了错误。编译代码段为:
public JsonResult ChangeFilterList(int option = 3)
{
var data = new[] { new { Text = "Unknown option", Value = long.MaxValue } };
switch (option)
{
case 2: data = _departmentnameRepository.All.Select(x => new { Text = x.DeptName, Value = (long)x.Id }).ToArray();
break;
case 3: data = Session["projectid"] == null
? _assetSequenceRepository.All.Select(x => new { Text = x.AssetShotName, Value = x.Id }).ToArray()
: _assetSequenceRepository.FindBy(p => p.ProjectId == (int)Session["projectid"]).Select(x => new { Text = x.AssetShotName, Value = x.Id }).ToArray();
break;
default: data = _userRepository.All.Select(x => new { Text = x.DisplayName, Value = (long)x.UserID }).ToArray();
break;
}
return Json(data, JsonRequestBehavior.AllowGet);
}
我的猜测是,您的FindBy
方法返回的对象的属性与您期望的对象具有不同的类型(例如int?
而不是int
)。尝试指定类型转换,以确保您的匿名类型具有正确的定义:
case 3: data = Session["projectid"] == null
? _assetSequenceRepository.All.Select(x => new { Text = x.AssetShotName, Value = x.Id }).ToArray()
: _assetSequenceRepository.FindBy(p => p.ProjectId == (int)Session["projectid"]).Select(x => new { Text = (string)x.AssetShotName, Value = (int)x.Id }).ToArray();
break;
关键更改是:
new { Text = (string)x.AssetShotName, Value = (int)x.Id })
↖ explicit type casts ↗
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句