VB.NET如何将其解析为对象属性?

Mat*_*eld 2 vb.net properties late-binding

好吧,所以我是一个C#编码器,我甚至无法阅读VB.NET,所以请原谅可能会变成一个令人难以置信的愚蠢问题.但我有一些看起来像这样的代码:

Function GetName(sourceObject as Object) as String
    return sourceObject.Name
End Function
Run Code Online (Sandbox Code Playgroud)

因此,忽略语法可能错误的事实 - VB.NET如何从sourceObject获取Name属性?在运行时检查它会发现sourceObject是一种支持带有getter的名为Name的属性的类型,但VB.NET在这种情况下做了什么?是否有一些额外的代码由编译器生成,以某种方式在运行时自动转换?

你可能会说,我有点困惑.提前致谢!

Har*_*rsh 6

这是后期绑定的情况.因此,如果sourceObject包含一个属性作为Name,它将返回该值,否则它将抛出一个未找到属性的错误.

C#中的后期绑定需要反射,因此它会抛出编译时错误,而在vb.net中,它可以在没有反射的情况下完成.

当对象分配给对象变量时,Visual Basic编译器执行称为绑定的进程.当一个对象被赋值给声明为特定对象类型的变量时,它就是早期绑定的.早期绑定对象允许编译器在应用程序执行之前分配内存并执行其他优化.相反,当一个对象被赋值给一个声明为Object类型的变量时,它就是后期绑定的.此类对象可以保存对任何对象的引用.

  • +1.如果你不喜欢这个"功能",我必须承认我讨厌它,使用Option Strict On来禁用它.可悲的是微软说[我们不能在VB中使用动态关键字](http://stackoverflow.com/questions/3305275/net-4-0-framework-dynamic-features-in-vb-with-option-strict-上/ 3608896) (3认同)