2012-02-15 49 views
2

好的,所以我是C#编码器,甚至在阅读VB.NET时遇到困难,所以请原谅可能是一个令人难以置信的愚蠢问题。但是,我有一些代码,看起来像这样:VB.NET如何将其解析为对象属性?

Function GetName(sourceObject as Object) as String 
    return sourceObject.Name 
End Function 

所以,无视事实,语法可能是错误的 - 如何VB.NET得到sourceObject Name属性?在运行时检查它显示sourceObject是一种支持名为带有getter的属性的类型,但VB.NET在这种情况下做了什么?是否有一些额外的代码由编译器以某种方式在运行时以自动方式进行强制转换?

正如你所能说的,我有点困惑。提前致谢!

回答

6

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

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

当 对象分配给对象变量时,Visual Basic编译器执行一个称为绑定的过程。当一个对象被分配给一个声明为特定对象 类型的变量时,该对象是早期绑定的 。早期绑定的对象允许编译器分配内存,并在应用程序执行之前执行其他优化。相比之下,当一个对象被分配给一个声明为Object类型的变量 时,该对象会被延迟。这种类型的对象可以容纳任何对象的引用。

+0

好的谢谢 - 但有没有一个参考的地方,可以确切地描述它是如何工作的?因为我需要将此代码转换为C#,并且我想以一种理智的方式复制功能(即尽可能不使用反射)... – 2012-02-15 11:43:56

+0

已在此msdn链接http://msdn.microsoft.com /en-us/library/0tcf61s1.aspx – Harsh 2012-02-15 11:45:16

+0

这将帮助你在C#中进行后期绑定http://kristofmattei.be/2010/02/11/c-late-binding/ – Harsh 2012-02-15 11:47:19

3

如果你使用的是C#4.0,那么你可以试试这个。

return ((dynamic)SourceObject).Name; 
1

只要知道VB的延迟绑定绕过类型检查与您的编译器。如果传入的对象没有Name属性,则可能会在运行时引发异常。

+0

是的,完全意识到这一点。这就是为什么我想了解它是如何工作的,所以我可以摆脱这种行为。 – 2012-02-18 11:24:16

2

由于内在的后期绑定,Object类型的所有VB变量都等价于已转换为动态的c#对象 - 或者换句话说,c#添加动态以获得VB的功能奇偶校验。

所以,等效C#代码将((dynamic) sourceObject).Name

我会去了解一下与泛型或者如果可能的接口这样做,因为那是一个更清洁的设计。

+0

是的,我打算用强大的打字重新做它,但在我重构某些东西之前,我想知道它究竟是如何操作的。 – 2012-02-17 19:53:48