C# 类型限制

C# 类型限制,c#,C#,我们可以将类的类型属性限制为特定类型吗 例如: 假设sampleControl是UI类(可能是Control,Form,…),其EntityType属性的值应该只接受typeof(实体)的值,而不接受typeof(非实体)的值。我们如何限制用户在设计时提供特定类型(因为-Sample是控件或表单,我们可以在设计时设置其属性),这在C#net中可能吗 我们如何使用C#3.0实现这一点 在我上面的类中,我需要类型属性,该属性必须是Entity之一。您必须创建从System.Type继承的类Entit

我们可以将类的类型属性限制为特定类型吗

例如:

假设sampleControl是UI类(可能是Control,Form,…),其EntityType属性的值应该只接受typeof(实体)的值,而不接受typeof(非实体)的值。我们如何限制用户在设计时提供特定类型(因为-Sample是控件或表单,我们可以在设计时设置其属性),这在C#net中可能吗

我们如何使用C#3.0实现这一点


在我上面的类中,我需要类型属性,该属性必须是Entity之一。

您必须创建从System.Type继承的类EntityType

public class EntityBaseType : System.Type
{ }
在你的控制之下

public EntityBaseType EntityType{get;set;}
我不建议这样做

当然,您可以在set语句中执行类型检查

class SampleControl {
        public Type EntityType{get;
        set
        {
            if(!value.Equals(typeof(Entity))
              throw InvalidArgumentException(); 
            //assign
        }
    }
}

另一个选择是,如果我假设正确,您可以针对实体类型编码,该类型是您案例中所有实体的基类。

这可能是泛型有帮助的场景。使整个类成为泛型是可能的,但不幸的是,设计者讨厌泛型;不要这样做,但是:

class SampleControl<T> where T : IEntity { ... }

您可以在EntityType的集合{}中检查该类型,如果该类型不同,则抛出异常。从该类型继承的Tbtw远远不简单。您有无数的抽象成员要实现。更好的选择是TypeDelegator。为什么设计师讨厌泛型?T:Entity所在的
类SampleControl有什么问题{
?如果将窗体作为泛型控件编写,则无法在窗体上使用该控件。IDE不支持这种用法。设计器讨厌泛型,因为他不知道应该在t中插入什么。
class SampleControl<T> where T : IEntity { ... }
public Type EntityType {get;private set;}
public void SetEntityType<T>() where T : IEntity {
    EntityType = typeof(T);
}
private Type entityType;
public Type EntityType {
    get {return entityType;}
    set {
        if(!typeof(IEntity).IsAssignableFrom(value)) {
            throw new ArgumentException("EntityType must implement IEntity");
        }
        entityType = value;
    }
}