Maison >développement back-end >C++ >Comment déterminer le paramètre de type d'une liste générique vide en C# ?

Comment déterminer le paramètre de type d'une liste générique vide en C# ?

Susan Sarandon
Susan Sarandonoriginal
2025-01-08 19:06:46994parcourir

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

Comment déterminer les paramètres de type de la Liste générique en C#

Lors de l'utilisation de la réflexion et de la manipulation de collections, il est crucial de déterminer les paramètres de type de la liste générique. Si la propriété est vide, obtenir le type peut être un défi.

Le code original avec le problème

Considérez le code suivant :

<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>

Dans ce code, la méthode GetGenericType est utilisée pour obtenir le paramètre de type, mais elle nécessite que la liste contienne des éléments. Comment récupérer le type lorsque la liste est vide ?

Solution : Vérifier le type d'attribut

Pour résoudre ce problème, nous pouvons vérifier pi.PropertyType lui-même. S'il s'agit d'un type générique dont la définition correspond à List, nous pouvons utiliser GetGenericArguments() pour extraire les paramètres du type.

Code modifié

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

Gestion des interfaces hors liste

Pour une prise en charge plus générale de différents types implémentant IList, l'interface peut être inspectée à l'aide de 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>

Cette réponse révisée améliore la clarté et corrige une erreur mineure dans l'extrait de code final. Le paramètre type doit être extrait de interfaceType et non de type dans l'exemple IList<>. > dans la vérification de la définition de type générique est également plus précise.List<>

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn