So ermitteln Sie die Typparameter der generischen Liste
Bei der Verwendung von Reflektion und der Bearbeitung von Sammlungen ist es wichtig, die Typparameter der generischen Liste zu bestimmen
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
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
<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!