2009-05-20 120 views
8

我想像下面C#:限制在方法參數(非通用參數)類型

public void Foo(System.Type t where t : MyClass) 
{ ... } 

換句話說編寫的函數,自變量類型是System.Type,我想限制所允許的Type s來自MyClass

有什麼辦法可以在語法上指定,或者t必須在運行時檢查嗎?

+0

也許你的方法是錯誤的。我看這個的方式,在MyClass上創建實例方法Foo()會容易得多,這樣所有派生類都可以調用Foo,並且可以使用this.GetType()執行相同的行爲,而無需額外的完整性檢查。 – Juliet 2009-05-20 03:23:43

+0

我這樣做的反射功能 - 在函數內,我需要訪問類型的屬性。 – kpozin 2009-05-20 03:39:13

回答

9

如果您的方法必須採用Type類型作爲參數,我認爲沒有辦法做到這一點。如果你有方法調用的靈活性,你可以這樣做:public void Foo(MyClass myClass),並通過調用.GetType()來獲得Type。

擴大一點。 System.Type是參數的類型,所以沒有辦法進一步指定應該傳遞什麼。就像一個採用1到10之間的整數的方法一樣,必須接受一個int,然後執行運行時檢查,以確保限制得到適當的遵守。

0

你爲什麼不使用

public void foo<t>(); 

呢?

1

你想要的東西理論上可以用屬性來完成。但是,這是更清楚(IMO)和不完全一樣的東西:

public void Foo(MyClass m) { 
    Type t = m.GetType(); 
    // ... 
} 
+0

當然,如果它爲空則不起作用。 :) – 2009-05-20 03:30:26

2

您可以使用以下方法:

public void Foo<T>(T variable) where T : MyClass 
{ ... } 

召喚就會像下面這樣:

{ 
    ... 
    Foo(someInstanceOfMyClass); 
    ... 
} 
3

指定類型爲MyClass,或從中派生,是對參數本身的值檢查。這就好像說出你好參數

void Foo(int hello) {...} 

必須在10到100之間。

您必須在運行時使用泛型或檢查類型,就像其他參數值檢查一樣。

0

您還可以使用擴展方法,這將是適用於所有對象轉換爲MyClass的:

public static class MyClassExtensions 
{ 
    public static void Foo(this MyClass obj) 
    { 
     // ... 
    } 
} 

而且你可以使用它,就像它是一個對象的普通方法:

var x = new MyClass(); 
x.Foo(); 
相關問題