c# - propiedades - Exponer la propiedad del indexador/predeterminado a través de COM Interop
propiedades calculadas c# (3)
Intente configurar el atributo DispId de la propiedad para que sea 0, como se describe aquí en la documentación de MSDN .
Estoy intentando escribir un componente en C # para ser consumido por ASP clásico que me permite acceder al indexador del componente (también conocido 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 de ASP:
Dim collection
Set collection = Server.CreateObject("MyCollection ")
Call collection.Add("key", "value")
Response.Write(collection("key")) '' should print "value"
¿Hay algún atributo que deba establecer, necesito implementar una interfaz o debo hacer otra cosa? 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 hacen uso de colecciones que usan estas propiedades predeterminadas (como Request.QueryString("key")
). Sugerencias alternativas son bienvenidas
Actualización: hice una pregunta de seguimiento: ¿Por qué el indexador de mi componente .NET no siempre es accesible desde VBScript?
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 usar 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 a la sugerencia de Rob Walker, lo conseguí trabajando agregando el siguiente método y atributo a MyCollection:
[DispId(0)]
public string Item(string key) {
return this[key];
}
Editar: vea esta mejor solución que utiliza un indexador.