VB.NET中CallbyName函数的缺点?

VB.NET中CallbyName函数的缺点?,.net,vb.net,reflection,.net,Vb.net,Reflection,在VB.NET中使用的在性能上有什么缺点吗?在.NET 2.0以后的版本中,有没有更好的方法来按名称进行调用。CallByBame基本上为您提供了“后期绑定”,即“在运行时确定方法”,而不是编译器为您确定的“早期绑定” 使用早期绑定,您可以是类型安全的,并且您将有更好的性能,因为您的代码将直接指向该方法。编译器将提前为您“查找” 由于在运行时查找该方法,并且您没有类型安全性,因此延迟绑定的性能较慢,这意味着该方法可能实际上不存在,并且您可能会得到一个异常。但如果您出于某种原因不知道对象的类型,这

在VB.NET中使用的在性能上有什么缺点吗?在.NET 2.0以后的版本中,有没有更好的方法来按名称进行调用。

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

如果
CallByName
函数不缓存方法绑定,那么最好编写自己的dispatch类,该类存储一个哈希表,以将名称字符串映射到
MethodInfo
对象。

我不熟悉CallByName,您会在哪个上下文中使用它?你有例子吗?CallByName将使用反射。所以,我不知道还有没有别的办法。您能描述一下您使用CallByName的场景吗?这将有助于确定您是否需要CallByName或其他东西。“Cecil有一个名字”是关于CallByName而不是缓存任何东西的正确说法。如果以这种方式重复调用相同的方法,则需要以某种方式缓存类型信息。如果你不这样做,事情真的会变慢。