我正在用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,因此我想确保需要这种解决方法,我没做错什么。