Option Strict On이있는 C # 'dynamic'에 해당하는 VB.NET
type safe VB.NET을 사용할 때 C # 4 'dynamic'키워드에 해당하는 것이 Option Strict On
있습니까?
동등한 것은 VB.NET의 Object이지만 Option Strict Off
. 와 Option Strict On
동등한 없습니다. 달리 말하면 dynamic 키워드 Option Strict Off
가 C #에 동일한 기능을 제공 합니다.
VB.NET에는 원래 후기 바인딩이라고하는 "동적"기능이 항상 내장되어 있습니다. 이 구문은 영원히 지원되었습니다.
Dim obj = new SomeComClass()
obj.DoSomething()
.NET 및 COM에서 구현 된 코드에 대해 작업했으며 후자가 가장 일반적으로 사용됩니다. C # 의 dynamic 키워드는 동일한 기능을 제공했습니다. VB.NET 버전 10에서는 변경되었지만 이제는 DLR도 사용하고 있습니다. Python 및 Ruby와 같은 언어 구현에 대한 동적 바인딩 지원을 추가합니다.
구문은 정확히 동일하므로 As없이 Dim 키워드를 사용하십시오. 그러나 Option Strict Off를 사용해야합니다. Option Infer On은 그 타격을 약간 부드럽게 할 수 있습니다. 동적 바인딩을 알리기 위해 특정 키워드를 사용하는 C #이 꽤 좋은 방법임을 보여줍니다. Afaik은 VB.NET에서 요청하는 모든 요청이 아직 고려되었지만 계획되지 않았습니다.
Option Strict On을 선호하는 경우 Partial Class 키워드를 사용하여 일부 코드를 다른 소스 파일로 이동할 수있는 것이 아마도 가장 효과적인 방법 일 것입니다.
이것은 Basic이 VB가 C #과 동일한 세분성을 갖지 않는 것에 대해 말하는 것을 보여줍니다. 리플렉션을 사용하여 런타임에 메서드를 동적으로 호출하는 C # 코드가 있습니다.
var listResult = tgtObj.GetType().GetMethod("GetSomeData").Invoke(tgtObj, null);
내가이 작업을 수행하는 이유는 "GetSomeData"가 각각 다른 데이터를 가져 오는 여러 메서드 중 하나 일 수 있기 때문입니다. 여기서 호출 할 메서드는 런타임에이 개체에 전달 된 문자열 매개 변수에 따라 다르므로 "GetSomeData"의 값은 런타임에 달라집니다.
"GetSomeData"의 서명은 다음과 같습니다.
public List<SomeResultSetClass> GetSomeData()
호출 된 각 메서드는 일종의 List<T>
객체를 반환 합니다. 다음으로, listResult 개체를 Export라는 일반 메서드로 보냅니다. 다음과 같습니다.
void Export<T>(List<T> exportList, string filePath, byte fileType) where T: class;
여기에서 문제가 발생합니다. Invoke는 System.Object 형식의 개체를 반환합니다. 물론 a List<T>
도 System.Object이지만 노출 된 인터페이스는 IList 인터페이스가 아닌 System.Object 인터페이스입니다. Export 메서드를 실행하려고하면 :
myExportObj.Export(listResult, parms.filePath, parms.fileType);
코드가 컴파일되지 않습니다. 오류는 다음과 같습니다.
The type arguments for method '...Export<T>...' cannot be inferred from the usage. Try specifying the type arguments explicitly.
고맙지 만 사양 할게!! 문제는 컴파일러가 System.Object 인터페이스를보고 있기 때문에 IList 메타 데이터를 찾을 수 없다는 것입니다. 이제 새를 만들고 List<T>
할당 (List<Whatever>) listResult
할 수 있지만 처음에는 동적 호출의 목적에 위배됩니다.
수정 사항은 다음과 같이 변경 var
하는 것입니다 dynamic
.
dynamic listResult = tgtObj.GetType().GetMethod("GetSomeData").Invoke(tgtObj, null);
동적은 컴파일 타임에 정적 유형 검사를 우회하므로 컴파일 오류가 발생하지 않습니다. 그런 다음 동적 개체가 Export 메서드에 전달되면 DLR (Dynamic Language Runtime)은 메서드 서명의 요구 사항을 충족하기 위해 개체를 암시 적으로 캐스팅 할 수 있는지 확인합니다. 물론 가능합니다.
좋습니다. 이것이 C #에서 작동하는 방식입니다. VB를 사용하면 다음과 같이됩니다.
Dim listResult = tgtObj.GetType().GetMethod("GetSomeData").Invoke(tgtObj, Nothing)
Option Strict On을 사용하면 예상대로이 줄은 컴파일러를 혼란스럽게합니다. 꺼져 있으면 잘 작동합니다. 즉, VB에서는 라인을 포함하는 전체 모듈에 대한 유형 검사기를 꺼야합니다. 그보다 더 세분화 된 것은 없습니다.
Option Infer On 및 Option Strict Off를 설정해도 매우 가까운 항목이 있습니다.
후기 바인딩 COM 개체 및 형식 안전 ( Option Strict On
)을 사용 하여 메서드와 속성을 처리 할 수있는 충분한 방법이 있습니다 . Microsoft.VisualBasic.Interaction.CallByName 및 System.Type.InvokeMember 메서드를 사용하는 경우입니다. (여기서 또는 별도의 "일부"파일을 만들 수 Option Strict
있습니다 Off
).
그러나 VB.NET의 후기 바인딩을 사용하여 이벤트를 처리하는 것은 C #의 동적 형식만큼 간단하지 않습니다. VB.NET의 동적 이벤트에서 "해킹"을 확인할 수 있습니다 .
예, ExpandoObject입니다.
Dim DObj = 새 System.Dynamic.ExpandoObject ()
DObj.A = "abc"
DObj.B = 123
Option Strict를 사용하더라도 ExpandoObject를 사용하여 다음과 같은 속성에 액세스 할 수 있습니다.
Dim doc = JsonConvert.DeserializeObject(Of ExpandoObject)("{""name"":""Bob""}")
Dim lookup as IDictionary(Of String, Object) = doc
lookup("name") ' Bob
Vb.Net에서 strict 옵션이있는 C # 동적 키워드에 해당하는 것은 NuGet 패키지 Dynamitey로 존재합니다.
install-package Dynamitey 후 다음과 같이 Vb.Net 코드를 작성할 수 있습니다.
Option Strict On : Option Infer On : Option Explicit On
Imports Dynamitey
Module Module1
Public Sub Main()
Dim o = Nothing
o = "1234567890"
Console.WriteLine(Dynamic.InvokeMember(o, "Substring", 5)) ' writes 67890
End Sub
End Module
또는 좀 더 읽기 쉽게 :
Option Strict On : Option Infer On : Option Explicit On
Imports Dynamitey
Module Module1
<Extension()>
Public Function Substring(self As Object, offset As Integer) As String
Return CType(Dynamic.InvokeMember(self, "Substring", offset), String)
End Function
Public Sub Main()
Dim o = Nothing
o = "1234567890"
Console.WriteLine(Substring(o, 5)) ' writes 67890
End Sub
End Module
VS2017 및 .net Framework 4.7.2로 테스트되었습니다.
'Nice programing' 카테고리의 다른 글
모든 요소에서 클래스를 제거하는 방법 jquery (0) | 2020.10.25 |
---|---|
Visual Studio 2012의 작업 목록에 표시되지 않는 할일 작업 (0) | 2020.10.25 |
java.lang.Math와 java.lang.StrictMath의 차이점은 무엇입니까? (0) | 2020.10.24 |
com.sun.jersey와 org.glassfish.jersey의 차이점 (0) | 2020.10.24 |
Groovy XmlSlurper 대 XmlParser (0) | 2020.10.24 |