我有几个(非常旧且代码冻结的)VB.Net 类库,其中有数十个从单个基类派生的类,
cBaseRow
。子类主要是在 cBaseRow 中调用 GetValue
的属性集合,提供到 .xls 文件的 O-R 映射。所以人们可以:
Dim N As Double = myRentRow.RentValue
RentValue
在 GetValue("RentValue")
上调用 cBaseRow
,然后 .TryParse
将其发送至 Double
。简单的东西。
还有另一个名为
NoteRow
的类,可以通过 cBaseRow
上类似的方法访问:
Public Function GetNote(Tab As String, Row as Integer, Field As String) As String
...这样您就可以检索任何字段上的注释,例如:
Dim N as String = myRentRow. GetNote("Rent", myRentRow.RowNum, "RentValue")
原始库不包含这些值的属性。我想添加它们...
Dim N as String = myRentRow.RentValueNote
我知道我可以使用扩展在现有库上实现方法。但是有几十个类,几十个字段,并且该库被用在几十个具有不同子类的项目中。
我的问题:VB中有没有一种方法可以在基类上实现“捕获”此类调用的方法?
例如,在 Obj-C 中,我可以重写 cBaseRow 中的
objc_msgSend
方法,任何未实现的方法调用都将落入此方法,方法调用作为字符串。
.Net中有类似的功能吗?
或者还有其他方法来实现这个吗?
对于您的直接问题“.NET 中是否有类似的功能”,答案是“否”。
另一种方法可以让您获得大部分的帮助,那就是制作诸如后期绑定或反射之类的东西,您可以在其中制作一个采用字符串参数(可能还有
ParamArray
或显式参数数组)的扩展方法。 您甚至可以使用它,就像 Obj-C 版本的反向操作一样,并使用反射来查找实际类型的现有成员。 我可以看到这种方法的两个缺点:首先,与后期绑定一样,如果您有签名问题(参数的名称或类型/计数),它将在运行时而不是编译时显示;其次,众所周知,反射速度很慢,因此您需要尽可能多地记住并避免在性能关键的路径上进行操作。