作为背景,我有一个.net <-> COM object bridge,它使用VB.net作为中间人,通过大量的反射来完成工作。
我遇到了一个障碍,我需要使用CallByName()来设置一个非常标准的属性,定义为
Public Default Property Item (
index As Integer
) As String
Get
Set它通常被称为.Object(1) = "new value",但是桥接代码现在尝试将.Object(1)作为对象,然后使用CallByName() (显然不起作用)对其进行调用。
对于其他集合,我很高兴能够使用CallByName()来进行方法调用.Clear()和.Add("new value"),但是这个属性没有这些方法,而且我还想为一种更通用的方法来解决它,这样桥的另一端的代码就可以直接调用.Object了。
有人能够建议一种直接使用CallByName()设置数组类型属性的方法,还是建议可以调用另一个反射函数来实现这一点?
发布于 2014-10-08 12:08:09
默认属性可以使用其名称作为普通属性使用。所以,给出一门课:
Class Foo
Default Public Property Item(index As Integer) As String
Get
'...
End Get
Set(value As String)
'...
End Set
End Property
End Class这三项财产转让都具有相同的效果:
Dim Bar As New Foo
Bar(1) = "x"
Bar.Item(1) = "x"
CallByName(Bar, "Item", CallType.Set, 1, "x")对于数组类型属性,参数在设置值之前传递给CallByName。
发布于 2014-10-08 12:08:36
您没有显示您是如何在该属性上使用CallByName的,这就让我们来猜测出了什么问题。.Object(1) = "new value"的语法也有点混乱:前导点是否意味着Object本身就是其他类型上的某种集合?
基本的答案在于查看声明,而不是如何正常使用它。由于"Item“是默认的,所以您通常可以省略”Item“,这一事实在这里不适用:
'foo(1) ==> foo.Item(1) = "Ziggy" ==>
CallByName(foo, "Item", CallType.Set, 1, "Ziggy")procName参数将是属性名,在本例中为Item。CallType.Set意味着你想要道具设置器(让或集合看起来都有效)。第一个参数是要设置/get的项的索引,最后一个参数是要传递的数据。
如果.Object应该意味着要引用集合属性,则答案大致相同:
'foo.bars(1) ==> foo.Bars.Item(1) = "Zoey" ==>
CallByName(foo.Bars, "Item", CallType.Set, 1, "Zoey")https://stackoverflow.com/questions/26249069
复制相似问题