如何在VB.NET中扩展/装饰第三方类?

时间:2012-07-06 18:50:23

标签: vb.net interface metaprogramming aop decorator

在Ruby中,所有类都是永远开放的。几乎任何时候都可以将新行为添加到任何类中。有没有办法在VB.NET中执行此操作?

例如,如果我希望现有应用程序(大型应用程序)中的所有DataRows都采用新行为,该怎么办?我意识到我可以创建一个继承自DataRow的自定义行类,但继承并不是我所追求的。这将涉及大量的返工,以确保在所有地方行实例化,我们从我们的自定义行类实例化。

我有两个关于如何做到这一点的粗略想法:

  1. 在我看来,方面(AOP)可以在这里工作。 Is there a way to layer behavior on top of existing methods?

  2. 是否可以应用a given Interface to existing classes

  3. 这里的主要目标是不必对现有代码进行任何大型改造。该系统实际上应该忽略这些分层的行为/方面。它应该包含对代码库的最小更改。

    目前,我们使用装饰器类实现了分层方面。问题是,系统知道本机行和行装饰器对象之间的区别。我希望能够传递系统认为是本机行的东西。同样,系统不必注意应用于行的装饰。它应该认为它有一行,而不是一些特殊的装饰。

    具体来说,我想装饰一行的默认设置Item(colName)属性,以便我可以修改传入的值。

1 个答案:

答案 0 :(得分:3)

扩展方法可以满足您的要求。有关详细信息,请参阅此处:

http://msdn.microsoft.com/en-us/library/bb384936.aspx

以下是该链接的一个示例,它为所有Print个对象添加了String方法:

Module StringExtensions
    <Extension()> 
    Public Sub Print(ByVal aString As String)
        Console.WriteLine(aString)
    End Sub
End Module

但是,您只能使用扩展方法来添加方法,而不是属性和字段。此外,您只能添加新方法或重载。您不能使用新方法覆盖现有方法。

因为你所说的,特别是能够覆盖类的索引器属性,扩展方法在这种情况下不会帮助你。我所知道的唯一其他选择是欺骗你的项目使用你的包装类而不是真正的包装类。您可以创建自己的库,在同一个命名空间中使用与您尝试扩展的库相同的名称来实现相同的类。您的包装器库将引用真实的包,并将继承原始类中的所有类。然后你可以扩展它们所有你想要的,你的其他项目可以简单地引用你的库而不是真正的库。要做到这一点,你当然需要使用大量的命名空间别名和很可能的程序集引用别名(这在VB.NET中是不可用的,所以你可能必须用C#编写库,它用{{1支持它关键字)。但我怀疑这对你来说可能不值得。