System.Dynamic ExpandoControl это возможно? - PullRequest
0 голосов
/ 26 февраля 2012

Я пытаюсь выяснить, как создать элемент управления веб-сервером, который по сути является ExpandoObject.

Желание состоит в том, чтобы автоматически создать свойство для элемента управления при его создании в разметке aspx.

Например:

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

Где атрибут someProperty еще не существует как свойство в элементе управления.

Я должен также упомянуть, что мне не нужны никакие функциональные возможности Control или WebControl. Мне просто нужно иметь возможность объявить это в разметке с помощью runat = "server" (что само по себе может потребовать, чтобы он был элементом управления, по крайней мере, я так думаю).

Возможно ли это? Если так, как я могу начать?

Большое спасибо.

1 Ответ

1 голос
/ 26 февраля 2012

Я думаю, что вашей первой ставкой будет реализация IAttributeAccessor :

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

. Парсер страницы ASP.NET вызывает IAttributeAccessor.SetAttribute для каждого атрибута, который он не можетКарта для публичной собственности.

Так что, возможно, вы можете начать с

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;
    }
}
...