.net - VB.NET中CallbyName函数的缺点?

标签 .net vb.net reflection

使用 CallByName function 是否有任何性能劣势?在 VB.NET 中?从 .NET 2.0 开始,有没有更好的方法来按名称进行调用。

最佳答案

CallByBame 基本上为您提供“后期绑定(bind)”,即“在运行时找出方法”,而不是编译器为您找出方法的“早期绑定(bind)”。

使用早期绑定(bind),您可以确保类型安全,并且您将获得更好的性能,因为您的代码将直接进入该方法。编译器会提前为您“查找”。

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

关于.net - VB.NET中CallbyName函数的缺点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1267588/

相关文章:

c# - 通过反射获取 String.Trim 的 MethodInfo?

java - ReflectionUtil getField 抛出 NullPointerException

c# - 有没有办法解析无效的 HTML?

.net - ‘WPF Ribbon Application’ 没有项目模板

c# - 如何在 C# 的 Excel.Range 对象中选择工作表中的所有单元格?

javascript - JS中单引号替换为双引号

vb.net - 在 PictureBox 上绘制矩形

reflection - 去(反射): How to Instantiate an arbitrary type and set a known embedded field

c# - 如何通过 Style setter 设置可为空的属性值?

c# - Silverlight 5 双击总是将 ClickCount 返回为 1