2011-03-02 2 views
0

나는 일반 객체를 가져 와서 무엇이 통과되었는지 확인하기 위해 TypeOf을 사용하는 방법이 있습니다. 이제 나는 List(Of T) (T가 무엇이든)을 전달하고 싶습니다. T가 무엇이든이 목록에 똑같은 것을하고 싶습니다. 나는 다음과 같은 시도 :VB.NET : 다른 일반 목록을 비교하는 방법

public sub foo(ByVal obj As Object) 
    if TypeOf obj Is List(Of Object) Then 
     'do stuff 
    end if 
end sub 

을하지만 내가 말, 그것을 List(Of String)를 전달하는 경우 작동하지 않습니다. 나는 List(Of Object)List(Of String)이 다른 객체로 취급되고 있다고 생각하지만, String이 객체이기 때문에 비교가 작동 할 수도 있다고 생각합니다.

이제는 이것이 죄만큼이나 추악하다는 것을 알았고 List(Of T)을 매개 변수로 사용하는 것이 좋습니다. 그러나 대부분 호기심을 묻습니다 : List(Of Object1)을 비교하는 방법이 있습니까? List(Of Object2) 그리고 긍정적 인 결과를 얻습니다. 둘 다 단지 List(Of T)일까요?

+3

어, 목록에 * 다른 * 유형이있는 경우 어떻게 비교할 것을 제안합니까? 나는 제네릭을 이용하고'List (Of T) '를 받아들이는 것이 잘못된 것이라고 이해하지 못한다. –

+1

"T와 상관없이이 목록에 같은 것을하고 싶습니다."- 그게 뭐지? – AakashM

답변

0

List(Of Object)List(Of String)입니다. 예를 들어 List(Of String)Button을 추가 할 수 없습니다.

.NET 4를 사용하는 경우 대신 IEnumerable(Of Object)을 확인하는 것이 좋습니다. 그러면 일반적인 공분산이 도움이 될 것입니다.

Foo 제네릭 자체를 만들지 않는 이유가 있습니까?

Public Sub Foo(obj As Object) 
    If obj.IsGenericList() Then 
     ... 
    End If 
End Sub 

... 

Imports System.Runtime.CompilerServices 

Public Module ObjectExtensions 
    <Extension()> _ 
    Public Function IsGenericList(obj As Object) As Boolean 
     Return obj.GetType().IsGenericType _ 
      AndAlso _ 
      obj.GetType().GetGenericTypeDefinition() = GetType(List(Of)) 
    End Function 
End Module 
: 확장 방법으로

Public Sub Foo(obj As Object) 
    If IsGenericList(obj) Then 
     ... 
    End If 
End Sub  

... 

Private Function IsGenericList(ByVal obj As Object) As Boolean 
    Return obj.GetType().IsGenericType _ 
      AndAlso _ 
      obj.GetType().GetGenericTypeDefinition() = GetType(List(Of)) 
End Function 

또는 대안을 : 오브젝트 유형의 경우 T가 어떤 종류의 상관없이, 당신은 다음 예에서와 같이 Type.GetGenericTypeDefinition()을 사용할 수 있습니다 List(of T)

+0

@ jon-skeet 일반화하지 않을 이유가 없습니다. 그러므로'List (Of String)'과'List (Of Object)'는 서로 다른 타입이지만 여전히 List (Of T)입니다. 'List (Of T)'는 일종의 청사진입니다. – geekchic

+0

'IEnumerable (Of Object) '을 제안했기 때문에 비 일반적인'IEnumerable'을 사용하지 않으시겠습니까? – stakx

+0

@geekchic : 예, 일종의. 의견에서 제네릭과 같은 거대한 기능을 설명하기는 어렵습니다. MSDN을주의 깊게 읽거나 좋은 책을 얻는 것이 좋습니다. –

1

확인하려면
+0

'List (Of)'문법은 +1이다. –

0

정확히 무엇을 성취하려고 하는지를 말하기 어렵습니다. 나는 읽기가 마음에 안좋다. 그래서 나는 다른 사람들이이 질문에 먼저 대답하도록 노력할 것이라고 생각했다. 그들의 해결책이 당신이 찾고있는 은색 총알이 아니었던 것처럼 보입니다. 그래서 나는 그것을 딱딱하게 만들 것이라고 생각했습니다.

Public Sub Foo(Of T)(ByVal myList As List(Of T)) 
    ' Do stuff 
End Sub 

이것은 일반적인 방법Foo을 만들고,이 경우 (객체가 인수로에서 통과 보장 :

나는 이것이 당신이 찾고있는 구문이 실제로 의심 (List(Of T))입니다. List(Of T)에 의해 구현 된 모든 메소드는 myList 매개 변수에서 호출 할 수 있습니다. 이는 올바른 유형임을 보장하기 때문입니다. Reflection만큼 복잡하지는 않습니다.

관련 문제