VB.NET эквивалент для C# 'dynamic' с опцией Strict On


есть ли эквивалент для ключевого слова c# 4 'dynamic' при использовании type safe VB.NET, т. е. с Option Strict On?

8 66

8 ответов:

эквивалент является объектом в VB.NET но с Option Strict Off. С Option Strict On нет эквивалента. Положите другой путь динамический ключевое слово приносит Option Strict Off эквивалентная функциональность в C#.

VB.NET всегда была встроена "динамическая" функция, первоначально называемая поздней привязкой. Этот синтаксис поддерживался всегда:

 Dim obj = new SomeComClass()
 obj.DoSomething()

работал над кодом, реализованным в .NET и COM, причем последний является наиболее распространенным. Элемент динамический ключевое слово в C# дало ему такую же возможность. Он действительно изменился VB.NET версия 10 однако, теперь он также использует DLR. Что добавляет поддержку динамической привязки к языковым реализациям, таким как Python и Рубин.

синтаксис точно такой же, используйте ключевое слово Dim без As. Однако вам придется использовать опцию Strict Off, опция Infer On может смягчить этот удар немного. Это показывает, что использование C# определенного ключевого слова для сигнала динамической привязки было довольно хорошим шагом. Afaik все просьбы сделать это в VB.NET так же как и до сих пор рассматривались, но не планировались.

Если вы предпочитаете опцию Strict On, то используйте ключевое слово Partial Class, чтобы вы могли переместить часть кода в другой исходный файл, вероятно, является наиболее эффективным подходом.

это продемонстрирует, что Basic говорит о том, что VB не имеет такой же детализации в этом, как C#. У меня есть этот кусок кода в C#, который использует отражение, чтобы вызвать метод динамически во время выполнения:

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

причина, по которой я это делаю, заключается в том, что "GetSomeData" может быть любым из нескольких методов, каждый из которых получает разные данные. Какой метод вызывать здесь зависит от строкового параметра, передаваемого в этот объект во время выполнения, поэтому значение "GetSomeData" изменяется во время выполнения.

подпись "GetSomeData":

public List<SomeResultSetClass> GetSomeData()

каждый из вызванных методов возвращает какой-то

вы можете включить Option Infer On и Option Strict Off и все еще иметь что-то очень близкое.

существует достаточно способов обработки методов и свойств с помощью объектов com поздней привязки и безопасного типа (Option Strict On). Это при использовании Microsoft.Визуальная основа.Взаимодействие.CallByName и система.Тип.Методы InvokeMember. (Или создать отдельный "частичный" файл, где Option Strict и Off).

но для обработки событий с поздней привязкой от VB.NET это не так просто, как с динамическим типом В C#. Вы можете проверить "взломать" для этого в динамические события в VB.NET.

Да, ExpandoObject.

Dim DObj = Новая Система.Активный.ExpandoObject()

DObj.A = "abc"

DObj.B = 123

обратите внимание, что даже с опцией Strict on вы все равно можете использовать, например, ExpandoObject для доступа к таким свойствам, как:

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

эквивалент динамического ключевого слова c# в Vb.Net с опцией strict on существует как пакет NuGet: Dynamitey .

после установки-пакет 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 .