我试图在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?
答案 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]
,因此我无法提前使用此功能。