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

时间:2012-03-14 10:36:12

标签: c# dynamic custom-controls

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

  1. 类型
  2. 参数
  3. 其中Type是枚举,

    public enum Type { XType , YType }
    

    Parameter的类型为String

    现在,我需要将Parameter更改为枚举。我确信每个Type都有两个参数。

    XTypeFoo, XTypeBar, YTypeFoo, YTypeBar

    之前,我将Parameter保留为String属性。现在我为此创建了两个枚举,

    public enum XParameter { XTypeFoo, XTypeBar } and
    public enum YParameter { YTypeFoo, YTypeBar }
    

    现在我需要将Parameter属性的类型从string更改为其他内容(取决于Type

    即如果用户选择TypeXType,则Parameter应为XParameter,如果YType则为XParameter

    那么什么是基类型。

3 个答案:

答案 0 :(得分:0)

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

为参数设置只有{ Foo, Bar }的枚举怎么样?

答案 1 :(得分:0)

你不能从enums开始,所以你需要使用课程。对每个枚举值使用类常量或“Dummyclass”:

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

public class BaseParameter { }

“Dummyclass”:

public class XParameter : BaseParameter { }
public class YParameter : BaseParameter { }
public class XTypeFoo : XParameter { }
public class XTypebar : XParameter { }
public class YTypeFoo : YParameter { }
public class YTypebar : YParameter { }

常量:

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();
}

在以下情况下,您可以使用IsAssignable来检查XParameterYParamter以及您使用的value is XTypeFoovalue == XParameter.TypeFoo

答案 2 :(得分:0)

如果Type将是一个枚举而Parameter也将是一个枚举(虽然允许的值将取决于Type),那么基本上所有可能的值都是事先已知的。那么为什么不对Parameter和丢弃Type属性进行单一的组合枚举?例如,

public enum ParameterType
{
  XTypeFoo,
  XTypeBar,
  YTypeFoo,
  YTypeBar,
}

或者,您可以开始询问有关类型信息的Parameter。例如,

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

   ...
}