2009-09-20 2 views
1

<T>의 목록을 만들고 있지만 해당 T 객체의 유형을 알고 싶습니다. (난 내 프로젝트에 반사를 사용하고, 그래서 난 내 코드를 만드는거야 때 나는 유형을 모르는시스템 유형입니다. 콜렉션 <T>

을 그래서 일단 난 내 List이 -. 지금은 싶어

>List<T> 값 (데이터 그리드의 열을 생성하는) 그 T-객체의 속성이 모두

어떤 도움?

당신은 그 목록에서 하나 개의 객체를 가지고 그 유형을 확인합니다. 확실히 더 나은 방법이 있지만 수

답변

0

, I 생각해.

+1

같은 유형의 컬렉션이 전부가 아니라면 어떻게 될까요? –

+0

@Ahmed - 그러면 그것은 합리적인 목록이 아닙니다. 실제로 목록의 첫 번째 항목을 보면 IList가 ITypeedList가 아니고 객체가 아닌 인덱서가없는 경우 사용되는 공식 폴백 방식입니다. 따라서 나쁜 제안은 아닙니다. 그러나 목록 자체에서 'T'*를 식별 할 수 있다면 바람직합니다. –

+0

질문에 분명히 List 이라고 나와 있는데 목록의 항목이 다른 유형이 될 이유가 없습니다 –

11

너 그것뿐만 GetType() 쉽게, 그리고 GetProperties()에 대한 반사를 사용하여 다음

void ProcessList<T>(List<T> list) { 
    Type typeOfT = typeof(T); 
    // Work with type... 
} 
+0

OP가 리플렉션 (질문)을 사용하는 경우, 미리 'T'를 미리 알지 못하고이 방법을 호출하는 좋은 방법은 없습니다. 적어도, C# 4.0이 될 때까지는 (동적 메서드로 사용할 수 있고 런타임에서 걱정할 필요가 없습니다). –

0

가 : 단지 대해서 typeof 클래스에서 (T) 또는 일반적인 방법을 사용할 수 있습니까?

1

GetListType의 경우는 this answer을 참조하십시오. 속성을 데이터 바인딩 목적의 목록 를 얻으려면, 당신은 정말 (호환성) 구성 요소 모델을 사용한다 - 즉

PropertyDescriptorCollection props = TypeDescriptor.GetProperties(type); 

그런 다음 사용하여 각 PropertyDescriptorGetValue/Converter 등 목록 코드는 일반적으로 비 제너릭 IList에 대해 작동해야합니다. 뭔가 같은 :

IList list = ... 
object obj = list[rowIndex]; 
// then for any given "prop" 
object val = prop.GetValue(obj); 
string displayText = prop.Converter.ConvertToString(val); 

그러나, 당신이 수 위의 유형에 대해 당신에게 형식 개체를 제공 ITypedList

0
values.GetType().GetGenericArguments()[0].FullName 

을 당신은 또한 IListSource 볼 필요 것 "완료"를 원한다면 'T' 당신이 맞는 볼

values.GetType().GetGenericArguments()[0].GetProperties(System.Reflection.BindingFlags.Public|System.Reflection.BindingFlags.Instance) 

(가) 위의 당신에게 'T'에서 사용할 수있는 공용 속성을 제공합니다, 당신은 적절한 BindingFlags의에 전달할 수 있습니다.