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
Libérer: 2025-01-08 19:06:46
original
1038 Les gens l'ont consulté

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 :

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,如何获取类型?
    }
}
Copier après la connexion

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é

Type type = pi.PropertyType;
if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(List<>))
{
    Type itemType = type.GetGenericArguments()[0]; // 这将给出类型
}
Copier après la connexion

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() :

foreach (Type interfaceType in type.GetInterfaces())
{
    if (interfaceType.IsGenericType && interfaceType.GetGenericTypeDefinition() == typeof(IList<>))
    {
        Type itemType = interfaceType.GetGenericArguments()[0]; // 注意此处使用 interfaceType
        // 对项目类型执行某些操作...
    }
}
Copier après la connexion

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 de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal