>백엔드 개발 >C++ >C#에서 빈 일반 목록의 'T' 유형을 어떻게 확인할 수 있나요?

C#에서 빈 일반 목록의 'T' 유형을 어떻게 확인할 수 있나요?

Susan Sarandon
Susan Sarandon원래의
2025-01-08 18:47:41522검색

How Can I Determine the Type `T` of an Empty Generic List in C#?

C# 일반 목록List<T>: T

의 유형을 결정합니다.

C#에서는 일반 목록을 사용하여 특정 유형의 요소를 저장할 수 있습니다. 하지만 빈 일반 목록의 T 유형을 결정해야 한다면 어떻게 될까요?

다음 시나리오를 고려해보세요.

<code class="language-csharp">List<myclass> myList = dataGenerator.getMyClasses();
lbxObjects.ItemsSource = myList;
lbxObjects.SelectionChanged += lbxObjects_SelectionChanged;</code>

lbxObjects_SelectionChanged 이벤트에서는 리플렉션을 사용하여 선택한 개체의 속성에 대한 정보를 검색합니다. 일반 목록(List<T>)의 경우 해당 목록에 포함된 요소의 유형을 가져오고 싶습니다.

이를 위해 GetGenericType 메서드를 사용할 수 있습니다. 이 메서드는 목록에 요소가 포함된 경우에 작동합니다. 그러나 목록이 비어 있으면 이 메서드는 실패합니다. 이 문제를 해결하려면 요소가 있는지 여부에 관계없이 유형 정보에 액세스해야 합니다.

해결책은 pi.PropertyType에 저장된 속성 유형을 확인하는 것입니다. 수정된 코드는 다음과 같습니다.

<code class="language-csharp">// 如果List<T>包含一个或多个元素,则此方法有效。
Type tTemp = GetGenericType(pi.GetValue(lbxObjects.SelectedItem, null));

// 如果列表为空,使用以下方法获取T的类型
Type type = pi.PropertyType;
if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(List<>))
{
    Type itemType = type.GetGenericArguments()[0];
    // 在此处使用itemType...
}</code>

또는 보다 포괄적인 지원을 위해 다음 유형으로 구현된 인터페이스를 확인할 수 있습니다.

<code class="language-csharp">foreach (Type interfaceType in type.GetInterfaces())
{
    if (interfaceType.IsGenericType && interfaceType.GetGenericTypeDefinition() == typeof(IList<>))
    {
        Type itemType = interfaceType.GetGenericArguments()[0];
        // 对itemType执行某些操作...
        break;
    }
}</code>

이러한 방법을 사용하면 요소가 포함되어 있는지 여부에 관계없이 T일반 목록 유형을 효과적으로 결정할 수 있습니다.

이 개정된 출력은 원본 이미지를 유지하고 더 나은 가독성을 위해 코드 형식을 개선합니다. 주요 변경 사항은 List<>에서 List 대신 typeof을 사용하여 더 나은 유형 일치를 확인하고 전반적인 흐름과 명확성을 개선하는 것입니다. 설명입니다.

위 내용은 C#에서 빈 일반 목록의 'T' 유형을 어떻게 확인할 수 있나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.