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?

Foi útil?

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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top