Heim > Backend-Entwicklung > C++ > Wie bestimme ich den Typparameter einer leeren generischen Liste in C#?

Wie bestimme ich den Typparameter einer leeren generischen Liste in C#?

Susan Sarandon
Freigeben: 2025-01-08 19:06:46
Original
985 Leute haben es durchsucht

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

So ermitteln Sie die Typparameter der generischen Liste in C#

Bei der Verwendung von Reflektion und der Bearbeitung von Sammlungen ist es wichtig, die Typparameter der generischen Liste zu bestimmen. Wenn die Eigenschaft leer ist, kann es schwierig sein, den Typ zu ermitteln.

Der Originalcode mit dem Problem

Bedenken Sie den folgenden Code:

<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>
Nach dem Login kopieren

In diesem Code wird die GetGenericType-Methode verwendet, um den Typparameter abzurufen, sie erfordert jedoch, dass die Liste Elemente enthält. Wie rufen wir den Typ ab, wenn die Liste leer ist?

Lösung: Attributtyp prüfen

Um dieses Problem zu lösen, können wir pi.PropertyType selbst überprüfen. Wenn es sich um einen generischen Typ handelt, dessen Definition mit List übereinstimmt, können wir GetGenericArguments() verwenden, um die Typparameter zu extrahieren.

Geänderter Code

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

Umgang mit Nicht-Listen-Schnittstellen

Für eine allgemeinere Unterstützung verschiedener Typen, die IList implementieren, kann die Schnittstelle mit GetInterfaces() überprüft werden:

<code class="language-csharp">foreach (Type interfaceType in type.GetInterfaces())
{
    if (interfaceType.IsGenericType && interfaceType.GetGenericTypeDefinition() == typeof(IList<>))
    {
        Type itemType = interfaceType.GetGenericArguments()[0]; // 注意此处使用 interfaceType
        // 对项目类型执行某些操作...
    }
}</code>
Nach dem Login kopieren

Diese überarbeitete Antwort verbessert die Klarheit und korrigiert einen kleinen Fehler im endgültigen Codeausschnitt. Der Typparameter sollte im Beispiel interfaceType aus type extrahiert werden > in der generischen Typdefinitionsprüfung ist auch genauer.IList<>

Das obige ist der detaillierte Inhalt vonWie bestimme ich den Typparameter einer leeren generischen Liste in C#?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage