Expor a propriedade do indexador / default via COM Interop
-
08-07-2019 - |
Pergunta
Eu estou tentando escrever um componente em C # para ser consumido pelo ASP clássico que me permite acessar o indexador do componente (propriedade aka padrão).
Por exemplo:
C # componente:
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 consumidor:
Dim collection
Set collection = Server.CreateObject("MyCollection ")
Call collection.Add("key", "value")
Response.Write(collection("key")) ' should print "value"
Existe um I necessidade atributo para definir, que eu preciso para implementar uma interface ou que eu preciso para fazer outra coisa? Ou isso não é possível através de interoperabilidade?
O objetivo é que eu estou tentando criar duplas de teste para alguns dos built-in ASP objetos como Request, que fazem uso de coleções usando essas propriedades padrão (como Request.QueryString("key")
). sugestões alternativas são bem-vindos.
Update: Eu fiz uma pergunta de acompanhamento: por que é o indexador no meu componente .NET nem sempre acessível a partir de VBScript?
Solução
Tente configurar o atributo DispId da propriedade para ser 0, como descrito aqui no MSDN documentação .
Outras dicas
Aqui está uma solução melhor que usa um indexador, em vez de um método Item
:
public class MyCollection {
private NameValueCollection _collection;
[DispId(0)]
public string this[string name] {
get { return _collection[name]; }
set { _collection[name] = value; }
}
}
Ele pode ser usado a partir de ASP como:
Dim collection
Set collection = Server.CreateObject("MyCollection")
collection("key") = "value"
Response.Write(collection("key")) ' should print "value"
Nota:. Eu não poderia chegar a este trabalho anterior, porque eu tinha sobrecarregado o indexador, this[string name]
, com this[int index]
Graças à ponta de Rob Walker, eu tenho que trabalhar, adicionando o seguinte método e atributo para MyCollection:
[DispId(0)]
public string Item(string key) {
return this[key];
}
Edit:. Consulte isso melhor solução que utiliza um indexador