次のシナリオがあります。
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 が疑うように: MyはasをassetSequenceRepository
供給しており、anonymousはnotを支持しています。C# コンパイラは暗黙的に にキャストしないため、エラーが発生しました。コンパイル スニペットは次のとおりです。id
long
Value
int
long
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);
}