ホームページ >バックエンド開発 >C++ >C# で空のジェネリック リストの型 `T` を決定するにはどうすればよいですか?

C# で空のジェネリック リストの型 `T` を決定するにはどうすればよいですか?

Susan Sarandon
Susan Sarandonオリジナル
2025-01-08 18:47:41474ブラウズ

How Can I Determine the Type `T` of an Empty Generic List in C#?

C# ジェネリック リストList<T>: T

の型を決定します。

C# では、汎用リストを使用して、特定の型の要素を保存できます。しかし、空の汎用リストの T 型を決定する必要がある場合はどうすればよいでしょうか?

次のシナリオを考えてみましょう:

<code class="language-csharp">List<myclass> myList = dataGenerator.getMyClasses();
lbxObjects.ItemsSource = myList;
lbxObjects.SelectionChanged += lbxObjects_SelectionChanged;</code>

lbxObjects_SelectionChanged イベントでは、リフレクションを使用して、選択したオブジェクトのプロパティに関する情報を取得しています。汎用リスト (List<T>) の場合は、そのリストが保持する要素の型を取得する必要があります。

これには、GetGenericType メソッドを使用できます。このメソッドは、リストに要素が含まれている場合に機能します。ただし、リストが空の場合、このメソッドは失敗します。この問題を解決するには、要素が存在するかどうかに関係なく、型情報にアクセスする必要があります。

解決策は、pi.PropertyType に格納されている属性タイプを確認することです。以下は変更されたコードです:

<code class="language-csharp">// 如果List<T>包含一个或多个元素,则此方法有效。
Type tTemp = GetGenericType(pi.GetValue(lbxObjects.SelectedItem, null));

// 如果列表为空,使用以下方法获取T的类型
Type type = pi.PropertyType;
if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(List<>))
{
    Type itemType = type.GetGenericArguments()[0];
    // 在此处使用itemType...
}</code>

また、より包括的なサポートが必要な場合は、このタイプで実装されているインターフェイスを確認できます:

<code class="language-csharp">foreach (Type interfaceType in type.GetInterfaces())
{
    if (interfaceType.IsGenericType && interfaceType.GetGenericTypeDefinition() == typeof(IList<>))
    {
        Type itemType = interfaceType.GetGenericArguments()[0];
        // 对itemType执行某些操作...
        break;
    }
}</code>

これらのメソッドを使用すると、要素が含まれているかどうかに関係なく、ジェネリック リストの T タイプを効果的に判断できます。

この改訂された出力では、元のイメージが維持され、読みやすくするためにコードの書式が改善されています。主な変更点は、List<> チェックで List の代わりに typeof を使用して型一致を改善し、全体的なフローと明瞭さを改善していることです。説明

以上がC# で空のジェネリック リストの型 `T` を決定するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。