2010-01-08 191 views
4

我们能否将类的Type属性限制为特定类型?类型限制

如:

public interface IEntity { } 

public class Entity : IEntity {} 

public class NonEntity{} 

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

假设sampleControl是UI类(可控制,表单,..)它的EntityType属性的值应该只接受使用typeof(实体)的值,而不是将typeof (NonEntity)如何限制用户在特定时间给出特定类型(因为Sample是一个控件或表单,我们可以在设计时设置它的属性),这在C#中是可行的.net

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

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

+3

您可以检查的EntityType的集合{}类型和抛出一个异常的类型是不同的 – A9S6

回答

6

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

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

为什么设计师讨厌泛型? –

+0

'class SampleControl Where's T:IEntity {'? –

+0

只要您将其作为通用控件编写,就无法在窗体上使用该控件。 IDE不支持该用法。 –

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

另一种选择是,您可以编写针对该基类所有的实体在你的情况,如果我假设正确的实体类型。

+0

BTW从类型继承远非如此简单。你有无数的抽象成员来实施。 TypeDelegator是更好的选择。 – leppie

+0

这就是为什么我说这不是建议这样做.. –