类型限制

时间:2010-01-08 06:17:51

标签: c#

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

例如:

public interface IEntity { }

public class Entity : IEntity {}

public class NonEntity{}

class SampleControl {
    public Type EntityType{get;set;}
}

假设sampleControl是UI类(可能是Control,Form,..),其EntityType属性的值应该只接受typeof(Entity)的值,而不是typeof(NonEntity)我们如何限制用户在设计时给出特定类型(bcause - 样本是我们可以在设计时设置其属性的控件或形式),这在C#.net

中是否可行

我们如何使用C#3.0实现这一目标?

在我上面的类中,我需要Type属性,它必须是IEntity中的一个。

2 个答案:

答案 0 :(得分:7)

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

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

现在SampleControl<Entity>有效,而SampleControl<NonEntity>没有。

同样,如果在设计时没有必要,你可以有类似的东西:

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

答案 1 :(得分:1)

您必须创建一个继承自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
        }
    }
}

另一种选择是,您可以根据您的案例中所有实体的基类类型进行编码,如果我假设正确的话。