Exponer el indexador / propiedad predeterminada a través de interoperabilidad COM

Estoy intentando escribir un componente en C # para ser consumido por el ASP clásico que me permite acceder al indexador del componente (también conocida como propiedad predeterminada).

Por ejemplo:
Componente 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 */ } } 

Consumidor ASP:

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

¿Debo establecer un atributo, necesito implementar una interfaz o debo hacer algo más? ¿O esto no es posible a través de COM Interop?

El propósito es que estoy intentando crear dobles de prueba para algunos de los objetos ASP incorporados, como Request, que utilizan colecciones utilizando estas propiedades predeterminadas (como Request.QueryString("key") ). Sugerencias alternativas son bienvenidas.

Actualización: hice una pregunta de seguimiento: ¿Por qué no siempre se puede acceder al indexador en mi componente .NET desde VBScript?

Intente establecer el atributo DispId de la propiedad en 0, como se describe aquí en la documentación de MSDN .

Aquí hay una mejor solución que utiliza un indexador en lugar de un método de Item :

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

Se puede utilizar desde ASP como:

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

Nota: No pude hacer que esto funcionara antes porque había sobrecargado el indexador, this[string name] , con this[int index] .

Gracias al consejo de Rob Walker, lo puse en funcionamiento agregando el siguiente método y atributo a MyCollection:

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

Editar: ver esta mejor solución que utiliza un indexador.