System.Dynamic ExpandoControl é possível?
-
13-11-2019 - |
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.
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;
}
}