4

以下のコード例では、ソースパラメーターの前にテキストを追加します。このテキストは、タイプであるか、 MoreLinq拡張機能を介してMVCドロップダウンリストで使用できます。この関数は、JSONとしてシリアル化されたリストを返すコントローラーアクションで使用されるため、ドロップダウンカスケードを使用して動的にロードできます。そうでない場合は、ビューモデルで個別にこれを実行します。ISiteIFactory

具体的なListItemクラスを作成せずに、以下のようなことを実行できる方法があるかどうか疑問に思いました。私の例は、私がどのように使用しているかを示していますas IListItemが、これはコンパイルされないことを認識しています。

現時点では、私のコントローラーにはモデルの具体的なクラスの概念がなく、それを維持したいと思っていました。これを機能させるためにListItemのインスタンスを作成する必要があるかどうか、または誰かが持っているかどうかはわかりません。別の提案?

ここで重要な場合に備えて、ジェネリック医薬品の共変性と反変性についての私の知識は限られていますか?ありがとう

    public interface IListItem
    {
        int Id { get; set; }
        string Name { get; set; }
    }

    public interface ISite : IListItem
    {
        int CountryId { get; set; }
    }

    public interface IFactory : IListItem
    {
        int SiteId { get; set; }
    }

    public interface IResource
    {
        int Id { get; set; }
        string Name { get; set; }
        int ContentID { get; set; }
        string Text { get; set; }
        int LanguageID { get; set; }
        string LanguageCode { get; set; }
        int Priority { get; set; }
    }

private IEnumerable<IListItem> PrependSelectionResource(IEnumerable<IListItem> source, string languageCode)
{
    if(source == null || source.Count() == 1)
        return source; // don't bother prepending the relevant resource in these cases

    try
    {
        // will throw an exception if languageCode is null or blank
        var resource = _resourceRepository.GetByNameAndLanguageCode(
            "Prompt_PleaseSelect",
            languageCode);

        if(resource == null)
            return source;

        // prepend the "Please Select" resource to the beginning of the source
        // using MoreLinq extension
        return source.Prepend(new {
            Id = 0,
            Name = resource.Text ?? ""
        } as IListItem);
    }
    catch {
        return source;
    }
}
4

2 に答える 2

3

残念ながら、あなたにできることは何もありません。IListItemメソッドへのインターフェースを実装するクラスの具体的なインスタンスを渡す必要がありますPrepend

アプリケーションの他の場所で実装を公開することを心配している場合は、と呼ばれるファイルにローカル実装を作成し、PlaceholderListItem代わりにそれを使用できます。

于 2013-01-05T17:06:48.947 に答える
2

匿名型(のようなnew { Id = 0, Name = resource.Text ?? "" })は、インターフェイスを実装しないクラスです(そして、以外の基本クラスはありませんobject)。したがって、機能しません。

モックフレームワークを使用する場合は、インターフェイスを実装する魔法のように生成されたクラスであるモックを作成できます。スタブとも呼ばれます。

しかし、この場合、もちろん、独自のモックを書くのは本当に簡単です。

class ListItemMock : IListItem
{
  public int Id { get; set; }
  public string Name { get; set; }
}

次に、オブジェクト初期化子を使用してインスタンス化できますnew ListItemMock { Id = 0, Name = resource.Text ?? "", }

于 2013-01-05T17:27:56.540 に答える