2010-01-08 139 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

這就是爲什麼我說這不是建議這樣做.. –