通过COM Interop公开索引器/默认属性

时间:2008-11-18 16:23:36

标签: c# collections asp-classic vbscript com-interop

我试图在C#中编写一个由经典ASP使用的组件,它允许我访问组件的索引器(也就是默认属性)。

例如:
C#组件:

public class MyCollection {
    public string this[string key] {
        get { /* return the value associated with key */ }
    }

    public void Add(string key, string value) {
        /* add a new element */
    }
}

ASP消费者:

Dim collection
Set collection = Server.CreateObject("MyCollection ")
Call collection.Add("key", "value")
Response.Write(collection("key")) ' should print "value"

是否需要设置属性,是否需要实现接口或是否需要执行其他操作?或者这不可能通过COM Interop?

目的是我尝试为某些内置ASP对象(如Request)创建测试双精度,这些ASP对象使用这些默认属性(例如Request.QueryString("key"))来使用集合。欢迎提供其他建议。

更新:我问了一个后续问题:Why is the indexer on my .NET component not always accessible from VBScript?

3 个答案:

答案 0 :(得分:3)

尝试将属性的DispId属性设置为0,如MSDN documentation中所述。

答案 1 :(得分:0)

感谢Rob Walker的提示,我通过向MyCollection添加以下方法和属性来实现它:

[DispId(0)]
public string Item(string key) {
    return this[key];
}

修改:请参阅使用索引器的this better solution

答案 2 :(得分:0)

这是一个使用索引器而不是Item方法的更好的解决方案:

public class MyCollection {
    private NameValueCollection _collection;

    [DispId(0)]
    public string this[string name] {
        get { return _collection[name]; }
        set { _collection[name] = value; }
    }
}

它可以在ASP中使用:

Dim collection
Set collection = Server.CreateObject("MyCollection")
collection("key") = "value"
Response.Write(collection("key")) ' should print "value"

注意:由于我使用this[string name]重叠了索引器this[int index],因此我无法提前使用此功能。