Pergunta

Estou tentando descobrir como criar um controle de servidor web que é basicamente um ExpandoObject.

O desejo é criar automaticamente uma propriedade no controle quando ele for criado na marcação aspx.

Por exemplo:

<x:ExpandoControl someProperty="a value"></x:ExpandoControl>

Onde o atributo someProperty ainda não existe como propriedade no controle.

Devo também mencionar que não preciso estritamente de nenhuma funcionalidade do Control ou do WebControl.Eu só preciso declará-lo na marcação com runat="server" (o que por si só pode exigir que seja um controle, pelo menos é o que estou pensando).

É possível?Se sim, como posso começar?

Muito obrigado.

Foi útil?

Solução

Acho que sua primeira aposta seria implementar IAttributeAccessor:

public interface IAttributeAccessor
{
    string GetAttribute(string key);
    void SetAttribute(string key, string value);
}

O analisador de páginas ASP.NET chama IAttributeAccessor.SetAttribute para cada atributo ele não pode ser mapeado para uma propriedade pública.

Então talvez você possa começar com

public class ExpandoControl : Control, IAttributeAccessor
{
    IDictionary<string, object> _expando = new ExpandoObject();

    public dynamic Expando
    {
        {
            return _expando;
        }
    }

    void IAttributeAccessor.SetValue(string key, string value)
    {
        _expando[key] = value;
    }

    string IAttributeAccessor.GetValue(string key)
    {
        object value;
        if (_expando.TryGetValue(key, out value) && value != null)
            return value.ToString();
        else
            return null;
    }
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top