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
Susan SarandonOriginal
2025-01-08 19:06:461038Durchsuche

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>

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>

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>

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!

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