sourcecode

옵션이 엄격하게 설정된 C# 'dynamic'에 해당하는 VB.NET

copyscript 2023. 6. 18. 16:14
반응형

옵션이 엄격하게 설정된 C# 'dynamic'에 해당하는 VB.NET

VB. VB와 함께 사용할 때 C4 '하는 것이 NET을 사용할 때 C#4 'dynamic' 키워드에 해당하는 것이 있습니까?Option Strict On?

하지만 VB가 있는 입니다.NET의 Object와 동등하지만 다음을 포함합니다.Option Strict Off.와 함께Option Strict On동등한 것은 없습니다.동적 키워드가 가져오는 다른 방법Option Strict OffC#에 해당하는 기능.

VB.NET에는 항상 "동적" 기능이 내장되어 있으며, 원래는 late binding이라고 합니다.이 구문은 영원히 지원됩니다.

 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#이 동적 바인딩을 신호하기 위해 특정 키워드를 사용하는 것이 상당히 좋은 조치였음을 보여줍니다.VB.NET에서 이를 위한 모든 요청을 페일오버하는 것은 아직 고려되지 않았지만 계획되지 않았습니다.

원하신다면Option Strict On그런 다음 사용합니다.Partial Class키워드를 사용하여 일부 코드를 다른 소스 파일로 이동하는 것이 가장 효과적인 방법일 것입니다.

여기에서는 VB가 C#과 동일한 세분성을 가지지 않는 것에 대해 Basic이 말하는 것을 보여줍니다.C#에 있는 이 코드 조각은 반사를 사용하여 런타임에 메서드를 동적으로 호출합니다.

var listResult = tgtObj.GetType().GetMethod("GetSomeData").Invoke(tgtObj, null);

제가 이렇게 하는 이유는 "GetSomeData"가 각각 다른 데이터를 가져오는 여러 가지 방법이 될 수 있기 때문입니다.여기서 호출할 메서드는 런타임에 이 개체에 전달된 문자열 매개 변수에 따라 다르므로 "GetSomeData" 값은 런타임에 달라집니다.

"GetSomeData"의 서명은 다음과 같습니다.

public List<SomeResultSetClass> GetSomeData()

어떤 ▁some▁each▁invoked▁sort다를 반환합니다.List<T>Export라는 는 다음과 .그런 다음 listResult 개체를 Export라는 일반 메서드로 보냅니다. 이 메서드는 다음과 같습니다.

void Export<T>(List<T> exportList, string filePath, byte fileType) where T: class;

여기서 문제가 발생합니다.호출은 시스템 유형의 개체를 반환합니다.이죠. 물론.List<T>또한 시스템입니다.개체, 그러나 노출된 인터페이스는 시스템입니다.IList 인터페이스가 아닌 개체 인터페이스입니다.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.

아니요!!그것이 제가 여기서 피하려는 것입니다.문제는 컴파일러가 시스템을 보고 있기 때문에 IList 메타데이터를 찾을 수 없다는 것입니다.개체 인터페이스.이제 새 파일을 생성할 수 있습니다.List<T>할당하다(List<Whatever>) listResult하지만, 그것은 애초에 동적 호출의 목적을 좌절시킵니다.

해결책은 변화하는 것입니다.var로.dynamic:

dynamic listResult = tgtObj.GetType().GetMethod("GetSomeData").Invoke(tgtObj, null);

동적은 컴파일 시 정적 형식 검사를 생략하므로 컴파일 오류가 발생하지 않습니다.그런 다음 동적 개체가 내보내기 메서드로 전달되면 DLR(Dynamic Language Runtime)은 메서드 서명의 요구 사항을 충족하도록 개체를 암시적으로 캐스트할 수 있는지 확인합니다.물론 할 수 있습니다.

좋아요, 그게 C#에서 작동하는 방식이군요.VB를 사용할 경우 행은 다음과 같습니다.

Dim listResult = tgtObj.GetType().GetMethod("GetSomeData").Invoke(tgtObj, Nothing)

Option Strict On을 사용하면 이 줄은 예상대로 컴파일러를 설정합니다.끄면 잘 작동합니다.즉, VB에서는 라인이 포함된 전체 모듈에 대한 유형 검사기를 꺼야 합니다.그것보다 더 세밀한 것은 없습니다.

옵션 추론 설정 및 옵션 엄격 해제를 설정해도 매우 가까운 항목을 유지할 수 있습니다.

COM 객체를 늦게 바인딩하고 유형이 안전한 메서드와 속성을 처리할 수 있는 충분한 방법이 있습니다.Option Strict On). Microsoft를 사용할 때 사용합니다.Visual Basic.상호 작용.이름 및 시스템으로 호출합니다.Type.InvokeMember 메서드를 입력합니다. (또는 별도의 "부분" 파일을 만듭니다.Option Strict이라Off).

그러나 VB.NET의 늦은 바인딩으로 이벤트를 처리하는 것은 C#의 동적 유형만큼 간단하지 않습니다.VB.NET동적 이벤트에서 해당 "해킹"을 확인할 수 있습니다.

Option Strict(옵션 제한)를 사용하더라도 ExpandoObject(예: 다음과 같은 속성)를 사용하여 액세스할 수 있습니다.

Dim doc = JsonConvert.DeserializeObject(Of ExpandoObject)("{""name"":""Bob""}")
Dim lookup as IDictionary(Of String, Object) = doc
lookup("name") ' Bob

Vb의 c# dynamic 키워드에 해당합니다.NuGet 패키지로 옵션이 엄격하게 지정된 Net이 존재합니다.다이너마이트.

설치 패키지 다이너마이트를 설치한 후 Vb를 작성할 수 있습니다.다음과 같은 순 코드:

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를 사용하여 테스트되었습니다.

예, ExpandoObject입니다.

Dim DObj = 새 시스템.역학.ExpandoObject()

DObj.A = "잘못됨"

DObj.B = 123

언급URL : https://stackoverflow.com/questions/2889974/vb-net-equivalent-for-c-sharp-dynamic-with-option-strict-on

반응형