Почему динамический объект в VB.NET вызывает TryInvokeMember вместо TryGetMember - PullRequest
1 голос
/ 13 мая 2019

Я занимаюсь разработкой .dll в C #, в которой широко используется DynamicObject.

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

Вот пример класса из моего .dll

namespace MyNamespace
{
    class MyDynamicClass : DynamicObject
    {
        public override bool TryGetMember(GetMemberBinder binder, out object result)
        {
            //Do stuff with property
        }

        public override bool TryInvokeMember(InvokeMemberBinder, object[] args, out object result)
        {
            //do stuff with function
        }
    }
}

В проекте на C # все работает как положено:

class Program
  {
    static void Main(string[] args)
    {
        dynamic myObj = new MyNamespace.MyDynamicClass();
        var getm = myObj.GetMember; //this will call TryGetMember
        var invokem = myObj.InvokeMember(); //this will call TryInvokeMember
    }
  }

В VB.NET обе строки приводят к вызову TryInvokeMember

Sub Main()
    Dim myObj = New MyNamespace.MyDynamicClass()
    Dim getm = g.GetMember 'calls TryInvokeMember
    Dim invokem = g.InvokeMember() 'calls TryInvokeMember
End Sub

Я могу решить свою проблему, просто вызвав TryGetMember в конце TryInvokeMember, если он не может вызвать его как функцию, однакопоскольку я никогда раньше не работал с VB.NET, я хотел убедиться, что этот обходной путь необходим, и я не делаю что-то не так.

...