ホームページ > バックエンド開発 > C++ > C# で空のジェネリック リストの型パラメーターを決定する方法

C# で空のジェネリック リストの型パラメーターを決定する方法

Susan Sarandon
リリース: 2025-01-08 19:06:46
オリジナル
1028 人が閲覧しました

How to Determine the Type Parameter of an Empty Generic List in C#?

C# でジェネリック List の型パラメーターを決定する方法

リフレクションを使用してコレクションを操作する場合、ジェネリック List の型パラメーターを決定することが重要です。プロパティが空の場合、型の取得が困難になる可能性があります。

問題のある元のコード

次のコードを考えてみましょう:

<code class="language-csharp">foreach (PropertyInfo pi in lbxObjects.SelectedItem.GetType().GetProperties())
{
    switch (pi.PropertyType.Name.ToLower())
    {
        case "list`1":
            // 如果 List<T> 包含元素,则此方法有效。
            Type tTemp = GetGenericType(pi.GetValue(lbxObjects.SelectedItem, null));
            // 但如果值为 null,如何获取类型?
    }
}</code>
ログイン後にコピー

このコードでは、GetGenericType メソッドを使用して型パラメータを取得していますが、リストに要素が含まれている必要があります。リストが空の場合に型を取得するにはどうすればよいでしょうか?

解決策: 属性タイプを確認してください

この問題を解決するには、pi.PropertyType 自体をチェックします。定義が List と一致するジェネリック型の場合は、GetGenericArguments() を使用して型パラメーターを抽出できます。

改造コード

<code class="language-csharp">Type type = pi.PropertyType;
if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(List<>))
{
    Type itemType = type.GetGenericArguments()[0]; // 这将给出类型
}</code>
ログイン後にコピー

リスト以外のインターフェースの処理

IList を実装するさまざまな型のより一般的なサポートについては、GetInterfaces() を使用してインターフェイスを検査できます。

<code class="language-csharp">foreach (Type interfaceType in type.GetInterfaces())
{
    if (interfaceType.IsGenericType && interfaceType.GetGenericTypeDefinition() == typeof(IList<>))
    {
        Type itemType = interfaceType.GetGenericArguments()[0]; // 注意此处使用 interfaceType
        // 对项目类型执行某些操作...
    }
}</code>
ログイン後にコピー

この改訂された回答は明確さを改善し、interfaceType の例では type を使用する最終コード スニペットの小さなエラーを修正します。 > ジェネリック型定義のチェックもより正確です。IList<>

以上がC# で空のジェネリック リストの型パラメーターを決定する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート