2010-01-08 2 views
4

Можем ли мы ограничить свойство Type класса конкретным типом?Ограничение типа

Например:

public interface IEntity { } 

public class Entity : IEntity {} 

public class NonEntity{} 

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

предположить, что sampleControl является класс UI (может быть контроль, форма, ..) ее стоимость EntityType собственности должна принимать только значение TYPEOF (Entity), но не TypeOf (NonEntity), как мы можем ограничить пользователя заданием определенного типа в Deign time (bcause - 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 где T: IEntity {'? –

+0

Просто вы не сможете использовать элемент управления в форме, если вы напишете его как общий элемент управления. IDE просто не поддерживает это использование. –

1

Вам понадобится создать класс EntityType, который наследуется от System.Type.

public class EntityBaseType : System.Type 
{ } 

В вашем контролем ..

public EntityBaseType EntityType{get;set;} 

Я не рекомендую делать это таким образом.

Конечно, вы можете выполнить проверку типа в задании набора.

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

Другой вариант заключается в том, что Вы можете закодировать от типа лица, которое является базовым классом всех ваших лиц в вашем случае, если я предположил, что правильно.

+0

BTW наследуя от типа далеко не просто. У вас есть бесчисленные абстрактные члены для реализации. Лучшим выбором будет TypeDelegator. – leppie

+0

Вот почему я сказал, что это не рекомендуется делать. –

Смежные вопросы