首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用CallByName设置Item(x)属性

使用CallByName设置Item(x)属性
EN

Stack Overflow用户
提问于 2014-10-08 04:09:07
回答 2查看 4.3K关注 0票数 0

作为背景,我有一个.net <-> COM object bridge,它使用VB.net作为中间人,通过大量的反射来完成工作。

我遇到了一个障碍,我需要使用CallByName()来设置一个非常标准的属性,定义为

代码语言:javascript
复制
    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()设置数组类型属性的方法,还是建议可以调用另一个反射函数来实现这一点?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-10-08 12:08:09

默认属性可以使用其名称作为普通属性使用。所以,给出一门课:

代码语言:javascript
复制
Class Foo
    Default Public Property Item(index As Integer) As String
        Get
            '...
        End Get
        Set(value As String)
            '...
        End Set
    End Property
End Class

这三项财产转让都具有相同的效果:

代码语言:javascript
复制
    Dim Bar As New Foo
    Bar(1) = "x"
    Bar.Item(1) = "x"
    CallByName(Bar, "Item", CallType.Set, 1, "x")

对于数组类型属性,参数在设置值之前传递给CallByName。

票数 2
EN

Stack Overflow用户

发布于 2014-10-08 12:08:36

您没有显示您是如何在该属性上使用CallByName的,这就让我们来猜测出了什么问题。.Object(1) = "new value"的语法也有点混乱:前导点是否意味着Object本身就是其他类型上的某种集合?

基本的答案在于查看声明,而不是如何正常使用它。由于"Item“是默认的,所以您通常可以省略”Item“,这一事实在这里不适用:

代码语言:javascript
复制
'foo(1) ==> foo.Item(1) = "Ziggy" ==> 
CallByName(foo, "Item", CallType.Set, 1, "Ziggy")

procName参数将是属性名,在本例中为ItemCallType.Set意味着你想要道具设置器(让或集合看起来都有效)。第一个参数是要设置/get的项的索引,最后一个参数是要传递的数据。

如果.Object应该意味着要引用集合属性,则答案大致相同:

代码语言:javascript
复制
'foo.bars(1) ==> foo.Bars.Item(1) = "Zoey" ==> 
CallByName(foo.Bars, "Item", CallType.Set, 1, "Zoey")
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26249069

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档