指定されたタイプのリストを返すジェネリックC#メソッド

ポール・リチャーズ

現在、13個の静的フィールドを持つ静的クラスがあります。各フィールドは静的な読み取り専用リストです。各リストのオブジェクトは異なるクラスですが、13のクラスすべてが同じクラスを拡張します。

コードに繰り返しがあることがわかりました。コードで各リストを13回取得する代わりに、タイプをキーとしてリストを辞書に入れるというアイデアをいじっています。一部の操作を辞書の反復に置き換えることができます。

簡単な実例を用意しましたが、特定のタイプのリストを返すメソッドを取得できません。GetListメソッドにList <T>を返すようにできますか?

public class ListGetter
{
    private static Dictionary<Type, List<Iab>> dict = new Dictionary<Type, List<Iab>>();

    public static List<Iab> GetList<T>() where T : Iab
    {
        List<Iab> list = dict[typeof(T)];
        return list;
    }
}

public interface Iab
{
}

public class ClassA : Iab
{
}

public class ClassB : Iab
{
}
ジェイミー・イデ

はい、できます。List<T>代わりに戻るように署名を変更しList<Iab>、内容をTにキャストする必要があります

public class ListGetter
{
    private static Dictionary<Type, List<Iab>> dict = new Dictionary<Type, List<Iab>>();

    static ListGetter()
    {
        var classAs = new List<Iab>();
        for (int i = 0; i < 10; i++)
        {
            classAs.Add(new ClassA());
        }
        dict.Add(typeof(ClassA), classAs);

        var classBs = new List<Iab>();
        for (int i = 0; i < 20; i++)
        {
            classBs.Add(new ClassB());
        }
        dict.Add(typeof(ClassB), classBs);

    }

    public static List<T> GetList<T>() where T : Iab
    {
        var list = dict[typeof(T)];
        return list.Cast<T>().ToList();
    }
}

または、IEnumerable拡張メソッドを使用することもできますがOfType<T>、リストに頻繁にアクセスする場合は遅くなる可能性があります。

public class ListGetter2
{
    private static IList<Iab> _list;

    static ListGetter2()
    {
        _list = new List<Iab>();
        for (int i = 0; i < 10; i++)
        {
            _list.Add(new ClassA());
        }

        for (int i = 0; i < 20; i++)
        {
            _list.Add(new ClassB());
        }
    }

    public static IList<T> GetList<T>() where T : Iab
    {
        return _list.OfType<T>().ToList();
    }
}

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

メソッドの引数として指定されたジェネリックリストタイプでObservableを渡す

分類Dev

指定されたタイプのジェネリックメソッド/クラスカスタム実装

分類Dev

C#ジェネリックメソッドはタイプのリストからタイプを返します

分類Dev

C#ネストされたクラスの場合、ジェネリックメソッドの型パラメーターを分解する

分類Dev

Javaメソッドに任意のタイプのジェネリックリストを返す方法

分類Dev

メインクラスのメソッドを使用して、ネストされたクラスからジェネリック型を返す方法

分類Dev

maxIdを返すためのC#ジェネリックメソッド

分類Dev

ジェネリックメソッドからインスタンスのリストを返す

分類Dev

渡されたのと同じクラスのジェネリックObservableCollectionを返すメソッドにジェネリッククラスを渡す

分類Dev

指定されたタイプに応じてジェネリックメソッドの呼び出しを実現します

分類Dev

List <T>を受け取るC#ジェネリックメソッドは、実際のタイプのTに対してオーバーロードされたメソッドを呼び出しません(ジェネリックメソッドを優先します)

分類Dev

リストを返すメソッドを持つジェネリックインターフェイス

分類Dev

ジェネリックメソッド内で型パラメーターが指定されているジェネリッククラスのイベントからサブスクライブを解除する

分類Dev

レコードのリストを返したいc#でジェネリックメソッドを作成しようとしています

分類Dev

同じタイプのオブジェクトの値を返すfinalメソッドでのジェネリックスの使用

分類Dev

動的オブジェクトタイプを返すジェネリックメソッド

分類Dev

C#でジェネリックメソッドをメモ化するために使用できるタイプシグネチャはどれですか?

分類Dev

ネストされたジェネリック型のメソッド

分類Dev

ネストされたジェネリック型の拡張メソッド

分類Dev

ジェネリックインスタンスを返すファクトリメソッド

分類Dev

ジェネリックコレクションでオーバーライドされたメソッドの型ヒントを指定する

分類Dev

C#メソッドでジェネリックリストを操作する

分類Dev

指定されたタイプのネストされたオブジェクトを含むドキュメントをRavenDBにクエリする方法

分類Dev

タイプを指定せずにジェネリッククラスの静的メソッドを呼び出すにはどうすればよいですか?

分類Dev

typescriptでジェネリッククラスのプロトタイプにメソッドを追加する方法

分類Dev

タイプを指定せずにFakeItEasyを使用した偽のジェネリックメソッド

分類Dev

C#ジェネリックスパラメーターとしてオブジェクト型を持たないジェネリックメソッドの引数として渡された型を取得するにはどうすればよいですか?

分類Dev

反映されたタイプ自体がリストである場合、ジェネリックc#リストをインスタンス化します

分類Dev

C#ジェネリックでインターフェイスメソッド呼び出しが無視されるのはなぜですか?

Related 関連記事

  1. 1

    メソッドの引数として指定されたジェネリックリストタイプでObservableを渡す

  2. 2

    指定されたタイプのジェネリックメソッド/クラスカスタム実装

  3. 3

    C#ジェネリックメソッドはタイプのリストからタイプを返します

  4. 4

    C#ネストされたクラスの場合、ジェネリックメソッドの型パラメーターを分解する

  5. 5

    Javaメソッドに任意のタイプのジェネリックリストを返す方法

  6. 6

    メインクラスのメソッドを使用して、ネストされたクラスからジェネリック型を返す方法

  7. 7

    maxIdを返すためのC#ジェネリックメソッド

  8. 8

    ジェネリックメソッドからインスタンスのリストを返す

  9. 9

    渡されたのと同じクラスのジェネリックObservableCollectionを返すメソッドにジェネリッククラスを渡す

  10. 10

    指定されたタイプに応じてジェネリックメソッドの呼び出しを実現します

  11. 11

    List <T>を受け取るC#ジェネリックメソッドは、実際のタイプのTに対してオーバーロードされたメソッドを呼び出しません(ジェネリックメソッドを優先します)

  12. 12

    リストを返すメソッドを持つジェネリックインターフェイス

  13. 13

    ジェネリックメソッド内で型パラメーターが指定されているジェネリッククラスのイベントからサブスクライブを解除する

  14. 14

    レコードのリストを返したいc#でジェネリックメソッドを作成しようとしています

  15. 15

    同じタイプのオブジェクトの値を返すfinalメソッドでのジェネリックスの使用

  16. 16

    動的オブジェクトタイプを返すジェネリックメソッド

  17. 17

    C#でジェネリックメソッドをメモ化するために使用できるタイプシグネチャはどれですか?

  18. 18

    ネストされたジェネリック型のメソッド

  19. 19

    ネストされたジェネリック型の拡張メソッド

  20. 20

    ジェネリックインスタンスを返すファクトリメソッド

  21. 21

    ジェネリックコレクションでオーバーライドされたメソッドの型ヒントを指定する

  22. 22

    C#メソッドでジェネリックリストを操作する

  23. 23

    指定されたタイプのネストされたオブジェクトを含むドキュメントをRavenDBにクエリする方法

  24. 24

    タイプを指定せずにジェネリッククラスの静的メソッドを呼び出すにはどうすればよいですか?

  25. 25

    typescriptでジェネリッククラスのプロトタイプにメソッドを追加する方法

  26. 26

    タイプを指定せずにFakeItEasyを使用した偽のジェネリックメソッド

  27. 27

    C#ジェネリックスパラメーターとしてオブジェクト型を持たないジェネリックメソッドの引数として渡された型を取得するにはどうすればよいですか?

  28. 28

    反映されたタイプ自体がリストである場合、ジェネリックc#リストをインスタンス化します

  29. 29

    C#ジェネリックでインターフェイスメソッド呼び出しが無視されるのはなぜですか?

ホットタグ

アーカイブ