Использование IExtenderProvider для предоставления свойства Type

Я пытаюсь добавить свойство Type для некоторых элементов управления в моем конструкторе WinForms. В идеале я хотел бы, чтобы они были сериализованы с использованием typeof(MyCompany.TheTypeIUsed) (а также способ сериализации BindingSource.DataSource).

Если оставить в стороне тот факт, что я не указал конструктор для типа, то получается, что если я добавлю IExtenderProvider, использующий тип, свойство не появится в сетке свойств. Если я использую int или string или любой другой тип, он работает нормально.

Это ошибка в реализации IExtenderProvider или требуются дополнительные атрибуты и т. Д.?

[ProvideProperty("CommandType", typeof (Control))]
public class TypeExtender : Component, IExtenderProvider
{
    private readonly Dictionary<Control, Type> controlCommands;

    public TypeExtender()
    {
        controlCommands = new Dictionary<Control, Type>();
    }

    #region impl

    bool IExtenderProvider.CanExtend(object target)
    {
        var control = target as Control;
        if (control == null)
        {
            return false;
        }
        return true;
    }

    [DefaultValue(null)]
    public Type GetCommandType(Control obj)
    {
        if (obj == null)
        {
            Debug.Fail("Non Control provided to Type getter");
            return null;
        }
        Type commandType;
        if (controlCommands.TryGetValue(obj, out commandType))
        {
            return commandType;
        }
        return null;
    }

    public void SetCommandType(Control obj, Type value)
    {
        if (obj == null)
        {
            Debug.Fail("Non control provided to Command Setter");
            return;
        }
        if (value == null)
        {
            controlCommands.Remove(obj);
        }
        else
        {
            controlCommands[obj] = value;
        }
    }

    [UsedImplicitly]
    private bool ShouldSerializeCommand(object c)
    {
        var control = c as Control;
        if (control == null)
        {
            return false;
        }
        Type type;
        if (controlCommands.TryGetValue(control, out type))
        {
            return type != null;
        }

        return false;
    }

    [UsedImplicitly]
    private void ResetCommand(object c)
    {
        if (c is Control)
        {
            controlCommands.Remove(c as Control);
        }
    }

    #endregion
}

0 ответов

Другие вопросы по тегам