为什么VB.NET中的动态对象调用TryInvokeMember而不是TryGetMember

时间:2019-05-13 14:11:47

标签: c# vb.net dynamicobject

我正在用C#开发一个.dll,它广泛使用DynamicObject。

在其他C#项目中的.dll正常工作,但是在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

我可以通过在TryInvokeMember的末尾调用TryGetMember来解决问题,如果它无法将其作为函数调用,但是由于我以前从未使用过VB.NET,因此我想确保需要这种解决方法,我没做错什么。

0 个答案:

没有答案