我想像下面C#:限制在方法參數(非通用參數)類型
public void Foo(System.Type t where t : MyClass)
{ ... }
換句話說編寫的函數,自變量類型是System.Type
,我想限制所允許的Type
s來自MyClass
。
有什麼辦法可以在語法上指定,或者t
必須在運行時檢查嗎?
我想像下面C#:限制在方法參數(非通用參數)類型
public void Foo(System.Type t where t : MyClass)
{ ... }
換句話說編寫的函數,自變量類型是System.Type
,我想限制所允許的Type
s來自MyClass
。
有什麼辦法可以在語法上指定,或者t
必須在運行時檢查嗎?
如果您的方法必須採用Type類型作爲參數,我認爲沒有辦法做到這一點。如果你有方法調用的靈活性,你可以這樣做:public void Foo(MyClass myClass),並通過調用.GetType()來獲得Type。
擴大一點。 System.Type是參數的類型,所以沒有辦法進一步指定應該傳遞什麼。就像一個採用1到10之間的整數的方法一樣,必須接受一個int,然後執行運行時檢查,以確保限制得到適當的遵守。
你爲什麼不使用
public void foo<t>();
呢?
你想要的東西理論上可以用屬性來完成。但是,這是更清楚(IMO)和不完全一樣的東西:
public void Foo(MyClass m) {
Type t = m.GetType();
// ...
}
當然,如果它爲空則不起作用。 :) – 2009-05-20 03:30:26
您可以使用以下方法:
public void Foo<T>(T variable) where T : MyClass
{ ... }
召喚就會像下面這樣:
{
...
Foo(someInstanceOfMyClass);
...
}
指定類型爲MyClass,或從中派生,是對參數本身的值檢查。這就好像說出你好參數
void Foo(int hello) {...}
必須在10到100之間。
您必須在運行時使用泛型或檢查類型,就像其他參數值檢查一樣。
您還可以使用擴展方法,這將是適用於所有對象轉換爲MyClass的:
public static class MyClassExtensions
{
public static void Foo(this MyClass obj)
{
// ...
}
}
而且你可以使用它,就像它是一個對象的普通方法:
var x = new MyClass();
x.Foo();
也許你的方法是錯誤的。我看這個的方式,在MyClass上創建實例方法Foo()會容易得多,這樣所有派生類都可以調用Foo,並且可以使用this.GetType()執行相同的行爲,而無需額外的完整性檢查。 – Juliet 2009-05-20 03:23:43
我這樣做的反射功能 - 在函數內,我需要訪問類型的屬性。 – kpozin 2009-05-20 03:39:13