2009-09-17 2 views
1

다음과 같은 코드가 있습니다.변수 유형의 '무엇인가'를 어떻게 만듭니 까?

Lookup(Of String)("Testing") 
Lookup(Of Integer)("Testing") 

두 Lookups 모두 훌륭합니다. 내가 시도하고있는 것은 다른 변수의 유형을 기반으로 적절한 LookUp을 호출하는 것입니다. 뭔가 보이는 것 ...

Lookup(Of GetType(MyStringVariable))("Testing") 

나는 이것을 시도했지만 적절한 검색을하기가 힘듭니다. 누구든지 내가 원하는 것을 어떻게 할 수 있는지 말해 줄 수 있니?

+0

는 당신이 그'Lookup's를 사용하는 방법의 예를주십시오 –

+0

_variable_ 유형 또는이 변수가 현재 보유하고있는 _value_ 유형? 나는. 'Dim x As Object = 123'의 경우'Object' 또는'Integer'를 원합니까? –

+0

실제로 응용 프로그램에서 다양한 유형의 Forms를 여는 데 사용됩니다. '현재'양식은 특정 유형이며 현재 양식의 유형으로이 조회를 호출하려고합니다. '현재 양식이 X이면 Lookup (Of X) ("Some Stuff"), 현재 양식이 Y, Lookup (Of Y)'인 추악한 경우가 있습니다. 저는 'Lookup (현재의 형식이 무엇이든간에)'이라고 말하고 싶지만 어떻게 작동하는지 모르겠습니다. –

답변

3

당신은 당신이 전화하는거야 방법에 대한 전체 서명을 지정하지 않은,하지만 내 초능력는이 있음을 말해 :

Function Lookup(Of T)(key As String) As T 

그리고 당신의 두 배 Integer를 반복하지 않으려 아래 예제 :

형식 매개 변수는 인수 컨텍스트에서 사용되지만 반환 값 컨텍스트에서는 사용되지 않는 경우에만 발생한다는 점에서 문제가 있습니다. 그래서, 당신은 트릭 할 수있는 ByRef 인수 도우미 함수가 필요합니다 : 그와

Sub Lookup(Of T)(key As String, ByRef result As T) 
    T = Lookup(Of T)(key) 
End Sub 

을, 당신은 쓸 수 있습니다 :

Dim x As Integer 
Lookup("foo", x); 
+0

나는 도움이 될 수 있다면 ByRef 인수에 대한 팬이 아니다 (때때로 필요할 수도 있음). +1은 영리한 접근법입니다. :) – eidylon

+0

매우 시원합니다. 그리고 내가 찾던 것을 아주 많이. 후속 조치. 내가 여기서 뭘하고 있는지 정말로 알고 싶다면 무엇을 검색하고 읽을 것입니까? 이것은 'Reflection'이 아닌 'Generics'가 될 것입니다. 맞습니까? –

+0

네, 제네릭을 원합니다. 제네릭 방식이 정확해야합니다. 리플렉션은 컴파일 타임이 아니라 런타임에만 알 수있는 유형 (예 : 변수의 실제 값 유형)에 의존하려는 경우 리플렉션에 참여해야합니다. 특히 http://msdn.microsoft.com/en-us/library/w256ka79.aspx 및 http://msdn.microsoft.com/en-us/library/ms235246.aspx를 참조하십시오. –

1

리플렉션을 사용하는 한 가지 해결책이 있습니다. 자세한 내용은 question을 참조하십시오.

1

VS2008의 VB.NET 컴파일러는 실제로 유형 - 추론을 사용합니다. 즉, 일반 메서드를 사용하고 매개 변수 중 하나가 제네릭 형식 인 경우 호출에 제네릭 형식을 지정할 필요가 없습니다. 당신이 목표에 대한 강력한 형식의 문자열로 전화 및 일반 매개 변수를 지정하지 않으면 다음과 같은 정의를 가지고

...

Function DoSomething(Of T)(Target As T) As Boolean 

, 그것은 문자열로 에게 T을 추론한다 .
대상에 대해에 대해 강력한 형식의 정수로 호출하고 제네릭 매개 변수를 지정하지 않으면 T을 정수로 유추합니다.

Dim myResult As Boolean = DoSomething("my new string") 

을 그리고 자동 문자열로 T의 유형을 추론합니다 다음과 같이

그래서 당신은이 함수를 호출 할 수있다.

편집 :
참고 :이 하나 또는 여러 개의 제네릭 매개 변수에 대한 작동합니다.
참고 : 리터럴뿐만 아니라 인수 목록의 변수에도 적용됩니다.

+0

Lookup (Of GetType (MyVariable))에서 'Keyword does not type.'이라는 오류 메시지가 나타납니다. 나는 더 자세히 살펴보고 내가 잘못한 것을 발견 할 수 있는지 알아볼 것입니다. –

+0

예, , 등과 같이 실제 유형 이름에 GetType을 사용해야합니다. 여기에서 유형을 지정하지 않아도됩니다. 함수에 변수를 전달하고 함수 호출에 일반 매개 변수를 두지 마십시오. 귀하의 함수가 Function Lookup (Of T) (As As T)로 정의되었다고 가정합니다. – eidylon

+0

나는 그의 경우'T'가 인수 유형이 아니라 오히려 결과 유형이라고 의심합니다. –

1

런타임 컴파일을 수행하지 않는 한 동적 유형을 사용할 수 없습니다. 물론 실제로는 비효율적입니다.

제네릭은 다른 유형을 사용할 수 있지만 컴파일러가 해당 유형의 특정 코드를 생성 할 수 있도록 컴파일 유형에서 유형을 계속 알아야합니다.

이것은 갈 길이 아닙니다. 해결해야 할 문제에 대해 묻는 대신, 해결하려는 문제에 대해 질문해야합니다. 비록 당신이 묻고있는 것에 가깝게 할 수 있다고 할지라도, 최선의 해결책은 완전히 다른 것입니다.

관련 문제