C# 使用IExtenderProvider提供类型属性

C# 使用IExtenderProvider提供类型属性,c#,winforms,iextenderprovider,C#,Winforms,Iextenderprovider,我正在尝试向WinForms designer中的某些控件添加类型属性。理想情况下,我希望使用typeof(MyCompany.TheTypeIUsed)对它们进行序列化(就像BindingSource.DataSource可以序列化一样) 抛开我没有为类型指定设计器这一事实不谈,如果我添加一个使用“type”的IExtenderProvider,该属性将不会出现在属性网格中。如果我使用int、string或任何其他类型,它都可以正常工作 这是IExtenderProvider实现中的错误还是需

我正在尝试向WinForms designer中的某些控件添加类型属性。理想情况下,我希望使用typeof(MyCompany.TheTypeIUsed)对它们进行序列化(就像BindingSource.DataSource可以序列化一样)

抛开我没有为类型指定设计器这一事实不谈,如果我添加一个使用“type”的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
}
[ProvideProperty(“CommandType”,typeof(Control))]
公共类TypeExtender:组件,IExtenderProvider
{
专用只读字典控制命令;
公共类型扩展器()
{
controlCommands=新字典();
}
#区域impl
bool IExtenderProvider.CanExtend(对象目标)
{
var控制=作为控制的目标;
if(control==null)
{
返回false;
}
返回true;
}
[默认值(空)]
公共类型GetCommandType(控制对象)
{
if(obj==null)
{
Debug.Fail(“提供给getter类型的非控件”);
返回null;
}
类型命令类型;
if(controlCommands.TryGetValue(obj,out commandType))
{
返回命令类型;
}
返回null;
}
public void SetCommandType(控制对象,类型值)
{
if(obj==null)
{
Debug.Fail(“提供给命令设置程序的非控制”);
返回;
}
如果(值==null)
{
控制命令。删除(obj);
}
其他的
{
控制命令[obj]=值;
}
}
[正确使用]
私有bool shouldSerialized命令(对象c)
{
var控制=c作为控制;
if(control==null)
{
返回false;
}
类型;
if(controlCommands.TryGetValue(控制,输出类型))
{
返回类型!=null;
}
返回false;
}
[正确使用]
私有无效重置命令(对象c)
{
如果(c是控制)
{
控件命令。删除(c作为控件);
}
}
#端区
}