VB.NET эквивалент для C# 'dynamic' с опцией Strict On
есть ли эквивалент для ключевого слова c# 4 'dynamic' при использовании type safe VB.NET, т. е. с Option Strict On
?
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()
каждый из вызванных методов возвращает какой-то
существует достаточно способов обработки методов и свойств с помощью объектов com поздней привязки и безопасного типа (
Option Strict On
). Это при использовании Microsoft.Визуальная основа.Взаимодействие.CallByName и система.Тип.Методы InvokeMember. (Или создать отдельный "частичный" файл, гдеOption Strict
иOff
).но для обработки событий с поздней привязкой от VB.NET это не так просто, как с динамическим типом В C#. Вы можете проверить "взломать" для этого в динамические события в VB.NET.
обратите внимание, что даже с опцией 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 .