2012-11-08 53 views
0

我想這樣做:C#泛型 - 是否可以限制一個方法只接受DataTable和String?

public void MyMethod<T>(T myArg) where T: DataTable, String 
{ 
    ... 
} 

這可能嗎?

+1

那麼,對於那些毫無意義的編譯器 - 它將如何知道哪一個傳入?你能解釋一下這種方法的用例嗎? – Oded

+0

查詢或數據表;如果查詢,我創建我自己的數據表,如果數據表,我使用數據。它幾乎看起來像我應該只有兩種方法,但這是醜陋的,我不能有相同數量的params,但不同類型的重載。所以它會像MyMethodUsingString()或MyMethodUsingDataTable()。毛。 – YuckMouth

+0

它可能是醜陋的(對你的敏感),但它是正確的解決方案。您在這裏並沒有真正使用泛型(或者說,您正在濫用它們)。 – Oded

回答

1

使它成爲兩個單獨的方法將是無限可取的。

public void MyMethod(DataTable myArg) 
{ 
    ... 
} 

public void MyMethod(String myArg) 
{ 
    ... 
} 

,或者,如果通用的(我不知道爲什麼一般需要在這種情況下)

public void MyMethod<T>(T myArg) where T: DataTable 
{ 
    ... 
} 

public void MyMethodStr<T>(T myArg) where T: string 
{ 
    ... 
} 

或者更糟的情況下,拋出錯誤,如果不是這些類型之一。這是最不可取的,因爲它會在運行時拋出而不編譯。

public void MyMethod<T>(T myArg) 
{ 
    if(myArg is String == false && myString is DataTable == false) 
     throw new InvalidArgumentException(...); 
} 

但是除此之外,沒有。

+0

如果我要分開的方法,我不需要使它們通用。另外,從我收集的內容中,不能將字符串作爲約束條件。 – YuckMouth

+0

哦,你也不能有相同數量的參數的重載,所以你的第一個想法不會工作..但是,我可以做MyMethodString(字符串參數)和MyMethodDataTable(DataTable參數)。 – YuckMouth

+1

您可以使用相同數量的參數進行重載。它們不能是同一類型的。 – smdrager

相關問題