4

我正在尝试用 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 互操作实现?

目的是我试图为一些内置的 ASP 对象(例如 Request)创建测试替身,这些对象使用使用这些默认属性(例如Request.QueryString("key"))的集合。欢迎提供替代建议。

更新:我问了一个后续问题:为什么我的 .NET 组件上的索引器并不总是可以从 VBScript 访问?

4

3 回答 3

4

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

于 2008-11-18T16:50:16.850 回答
0

感谢 Rob Walker 的提示,我通过将以下方法和属性添加到 MyCollection 来使其工作:

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

编辑:查看这个使用索引器的更好的解决方案。

于 2008-11-19T07:43:28.013 回答
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]

于 2008-11-23T00:25:05.370 回答