VB.NET中CallbyName函数的缺点?

Gre*_*ens 8 .net vb.net reflection

使用VB.NET中的CallByName函数在性能上有任何缺点吗?有没有更好的方法在.NET 2.0以后通过Name进行调用.

Tom*_*ter 7

CallByBame基本上给你"后期绑定",即"在运行时找出方法"而不是"早期绑定",编译器会为你找出它.

使用早期绑定,您可以保持类型安全,并且您将获得更好的性能,因为您的代码将直接用于该方法.编译器会提前为您"查找".

由于在运行时查找方法并且您没有类型安全性,因此后期绑定性能较慢,这意味着该方法实际上可能不存在,您可能会遇到异常.但如果由于某种原因你不知道对象的类型,这可能会很方便.如果我不想弄乱互操作程序集,我也用它来调用COM对象.

CallByName最有可能调用Type.InvokeMember.如果你想直接这样做,这里是我提出的一些代码:

Imports System.Reflection   ' For access to BindingFlags '

Friend NotInheritable Class LateBinding

    Private Const InvokePublicMethod As BindingFlags = BindingFlags.Public Or BindingFlags.Instance Or BindingFlags.InvokeMethod

    Private Const GetPublicProperty As BindingFlags = BindingFlags.Public Or BindingFlags.Instance Or BindingFlags.GetProperty

    Public Shared Function InvokeFunction(ByVal oObject As Object, ByVal sName As String, ByVal ParamArray yArguments() As Object) As Object

        Return oObject.GetType().InvokeMember(sName, InvokePublicMethod, Nothing, oObject, yArguments)

    End Function

    Public Shared Function GetProperty(ByVal oObject As Object, ByVal sName As String, ByVal ParamArray yArguments() As Object) As Object

        Return oObject.GetType().InvokeMember(sName, GetPublicProperty, Nothing, oObject, yArguments)

    End Function

End Class
Run Code Online (Sandbox Code Playgroud)