3

次のシナリオがあります。

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);
}

case2default見栄えはしますが、ケース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# コンパイラは暗黙的に にキャストしないため、エラーが発生しました。コンパイル スニペットは次のとおりです。idlongValueintlonglongint

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);
        }
4

3 に答える 3

4

私の推測では、あなたの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    ↗
于 2013-10-07T12:15:58.463 に答える
0

次のテスト コードは問題なくコンパイルされます。

public void Test(int option, string parameter)
{
    var data = new[] { new { Text = "Unknown option", Value = -1 } };

    switch(option)
    {
        case 2:
            data = Enumerable.Range(1, 4)
                             .Select(x => new { Text = x.ToString(), Value = x })
                             .ToArray();
            break;
        case 3:
            data = (new Random()).Next(2) % 2 == 1
                ? Enumerable.Range(1, 6)
                            .Select(x => new { Text = x.ToString(), Value = x })
                            .ToArray()
                : Enumerable.Range(1, 2)
                            .Select(x => new { Text = x.ToString(), Value = x })
                            .ToArray();
            break;
        default:
            data = Enumerable.Range(1, 3)
                             .Select(x => new { Text = x.ToString(), Value = x })
                             .ToArray();
            break;
    }
}

適切な/プロパティ値を取得するために、リポジトリ呼び出しEnumerable.Range()Selectラムダのみを変更しました。stringint

コンパイルしようとしているコードとまったく同じではないことを示したと思います。実際のコードには、名前が一致しない (例: 大文字と小文字が正しくない) または型が正しくないプロパティが 1 つあります。

マウス ポインターをToArray()呼び出しの上に置くと、それを把握することができます。ツールチップにa is new { string Text, int Value }印刷されます。

于 2013-10-07T12:12:15.293 に答える