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
改造コード
<code class="language-csharp">Type type = pi.PropertyType; if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(List<>)) { Type itemType = type.GetGenericArguments()[0]; // 这将给出类型 }</code>
リスト以外のインターフェースの処理
IList
<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 サイトの他の関連記事を参照してください。