3

1 つのジェネリック パラメーターを受け入れるパブリック ジェネリック メソッドがあります。また、ジェネリック メソッドから呼び出している具象型引数を受け入れるプライベート メソッドがいくつかあります。私の問題をよりよく説明するには、以下のコードを見てください。

    public void Save<T>(T entity) where T : class
    {
        if(entity is LibraryItem)      Save(entity as LibraryItem);
        else if(entity is Folder)      Save(entity as Folder);
        else if(entity is ProductType) Save(entity as ProductType);
        else if(entity is ProcessName) Save(entity as ProcessName);
    }

そしてプライベートメソッド:

private void Save(ProcessName proc){}
private void Save(ProductType type){}
private void Save(Folder folder){}
...

コードを見ると、解決策が本当に好きではありません。考えられるすべてのタイプをチェックすることは、私見の悪い習慣のように見えます。それで、私の問題に対するよりクリーンな解決策があるのだろうか?実行時に T を動的にキャストし、適切なプライベート メソッドを呼び出すことは可能でしょうか?

4

3 に答える 3

7

ランタイムタイプ定義を使用します。

public void Save<T>(T entity) where T : class
{
    Save((dynamic)entity);
}

private void Save(LibraryItem lib){}
private void Save(ProcessName proc){}
private void Save(ProductType type){}
private void Save(Folder folder){}

また、エンティティがLibraryItem、ProcessName、ProductType、またはFolderでない場合を処理するには、オブジェクトタイプのパラメーターを持つ1つのメソッドが必要です。

private void Save(object obj) {  }
于 2013-01-08T18:42:35.023 に答える
4

あなたは正しい方向に進んでいます。dynamicキーワードを使用して、実行時の過負荷解決を取得します。

Save((dynamic)entity);

object通常、過負荷の解決は、静的型(ジェネリック型用)のコンパイル時に行われます。キャストするdynamicことにより、解決を実行時に延期し、静的タイプの代わりにランタイムタイプが使用されます。

于 2013-01-08T18:42:55.187 に答える
2

理想的なメカニズムはSave、ポリモーフィズムを使用できるように、その型に固有の の側面をすべて具体的な型の一部にすることです。

各項目がそれ自体を保存する責任を負うのは適切ではない可能性がありますが、それが行うべきことは、他の誰かがSave単純にインターフェイスまたは基本型を受け入れる汎用メソッドを記述できるようにするのに十分な情報を公開することです。タイプを保存するのに十分な情報を公開します。

于 2013-01-08T18:50:09.370 に答える