C# 如何在Windows自定义控件中设置动态属性

C# 如何在Windows自定义控件中设置动态属性,c#,dynamic,custom-controls,C#,Dynamic,Custom Controls,我创建了一个用户控件,它有两个属性 类型 参数 其中,类型是枚举 public enum Type { XType , YType } 而参数的类型为字符串 现在,我需要将参数更改为enum。我确信每个类型都有两个参数 它们是XTypeFoo、XTypeBar、YTypeFoo、YTypeBar 在此之前,我将参数保留为字符串属性。现在我已经为此创建了两个枚举 public enum XParameter { XTypeFoo, XTypeBar } and public enum YPara

我创建了一个用户控件,它有两个属性

  • 类型
  • 参数
  • 其中,
    类型
    是枚举

    public enum Type { XType , YType }
    
    参数
    的类型为
    字符串

    现在,我需要将
    参数
    更改为enum。我确信每个
    类型都有两个参数

    它们是
    XTypeFoo、XTypeBar、YTypeFoo、YTypeBar

    在此之前,我将
    参数
    保留为
    字符串
    属性。现在我已经为此创建了两个枚举

    public enum XParameter { XTypeFoo, XTypeBar } and
    public enum YParameter { YTypeFoo, YTypeBar }
    
    现在我需要将
    参数
    属性的类型从
    字符串
    更改为其他类型(取决于
    类型

    i、 e如果用户选择
    Type
    作为
    XType
    ,则
    参数应为
    XParameter
    ,如果
    YType
    XParameter


    那么什么是基本类型。

    不可能,我认为不需要它。你应该重新设计你的课程


    让一个枚举只有
    {Foo,Bar}
    作为参数怎么样?

    您不能从
    枚举中插入,所以您需要使用类。为每个枚举值使用类常量或“Dummyclass”:

    在这两种情况下,您都使用基类:

    public class BaseParameter { }
    
    “Dummyclass”:

    常数:

    public class XParameter : BaseParameter
    {
        public readonly BaseParameter TypeFoo = new XParameter();
        public readonly BaseParameter TypeBar = new XParameter();
    }
    public class YParameter : BaseParameter
    {
        public readonly BaseParameter TypeFoo = new YParameter();
        public readonly BaseParameter TypeBar = new YParameter();
    }
    

    在这两种情况下,您都可以用来检查
    XParameter
    yparameter
    以及
    值为XTypeFoo
    值==XParameter.TypeFoo

    的确切值,如果
    Type
    将是枚举,而
    参数
    也将是枚举(虽然允许的值将取决于
    类型
    ),但本质上,所有可能的值都是事先已知的。因此,为什么不为
    参数
    创建一个单一的组合枚举,并放弃
    类型
    属性?例如

    public enum ParameterType
    {
      XTypeFoo,
      XTypeBar,
      YTypeFoo,
      YTypeBar,
    }
    
    public interface IParameter
    {
       public ParamType GetParamType();
    }
    
    public sealed class FooParameter : IParameter
    {
      public static readonly FooParameter XParameter = new FooParameter();
      public static readonly FooParameter YParameter = new FooParameter();
    
      public ParamType GetParamType() { return ParamType.Foo; }
    
      private FooParameter() { }
    }
    
    public sealed class BarParameter : IParameter
    {
      public static readonly BarParameter XParameter = new BarParameter();
      public static readonly BarParameter YParameter = new BarParameter();
    
      public ParamType GetParamType() { return ParamType.Bar; }
    
      private BarParameter() { }
    }
    
    public class MyControl : UserControl
    {
       IParameter Parameter {get; set; }
    
       ...
    }
    
    或者,您可以开始询问有关类型信息的
    参数

    public enum ParameterType
    {
      XTypeFoo,
      XTypeBar,
      YTypeFoo,
      YTypeBar,
    }
    
    public interface IParameter
    {
       public ParamType GetParamType();
    }
    
    public sealed class FooParameter : IParameter
    {
      public static readonly FooParameter XParameter = new FooParameter();
      public static readonly FooParameter YParameter = new FooParameter();
    
      public ParamType GetParamType() { return ParamType.Foo; }
    
      private FooParameter() { }
    }
    
    public sealed class BarParameter : IParameter
    {
      public static readonly BarParameter XParameter = new BarParameter();
      public static readonly BarParameter YParameter = new BarParameter();
    
      public ParamType GetParamType() { return ParamType.Bar; }
    
      private BarParameter() { }
    }
    
    public class MyControl : UserControl
    {
       IParameter Parameter {get; set; }
    
       ...
    }
    

    请不要在标题前加上“C:”之类的前缀。这就是标签的作用。