2012-08-15 65 views
1

這是C#中的一段代碼,我試圖理解它。 一個類在接口中有以下方法可用。在C#中調用方法class

T GetLookupValue<T, S>(string sTName, string sFName, string sLuName, S value); 

當我用dotPeek來看這個類的用法時,它顯示了這個。

public T GetLookupValue<T, S>(string sTName, string sFName, string sLuName, S value) 
{ 
    return (T) this.db.a(sTName, sFName, sLuName, false, (object) value, false, false); 
} 

如何調用此方法?我需要用T和S代替什麼?

+2

我看不出有任何通用的約束等等,任何東西。那會導致運行時錯誤不是完全是另一個問題。 – asawyer 2012-08-15 17:34:00

+0

你可以在這裏替換任何東西。 – Ankush 2012-08-15 17:35:03

回答

2

該方法表現爲廣義查找功能。如果實現真正能夠處理任何類型的,那麼你可以使用任何類型的在所有的S和T

例子:

string result = GetLookupValue<string, int>("tname", "fname", "luname", 42); 

MyClass result = GetLookupValue<MyClass, string>("tname", "fname", "luname", "blah"); 
1

Here is a great introduction to C# generics,這是這是什麼。

基本上,你只需用任何你想要的T和S來代替。 T是你的返回類型,而S將是被用於最終參數(value

例如類型:

var myObject = GetLookupValue<MyObject, MyOtherObject>("sTName", "sFName", "sLuName", (MyOtherObject)myOtherObject); 

這允許更健壯的代碼。在這裏您可以塑造一個方法是無論你需要它是

泛型是如何可以把任何東西在List<T>

List<String> stringList = new List<String>(); 
List<int> intList = new List<int>(); 
... 

在編譯的時候,你的泛型值內置於您的代碼。所以,如果你在我上面的例子做了dotPeek,你會看到這樣的事情:

public MyObject GetLookupValue<MyObject, MyOtherObject>(string sTName, string sFName, string sLuName, MyOtherObject value) 
{ 
    return (MyObject) this.db.a(sTName, sFName, sLuName, false, (object) value, false, false); 
} 

***但是,在寫這一點,具有參數value作爲通用似乎相當沒有意義的,因爲它僅僅是投到object ....他們可能已經使它T GetLookupValue<T>(string sTName, string sFName, string sLuName, object value);。 (它允許最終拳擊值對象(即整型,雙等)

1

如何調用該方法

這將取決於您要使用什麼類型的?例如:

int result = GetLookupValue<int, string>("tname", "fname", "luname", "some value"); 
1

類型T及S類型爲了調用此方法,並存儲結果,可以使用:

SomeClass returnedObject = GetLookupValue<SomeClass, SomeOtherType>("", "", "", ""); 

該方法將返回一個類型,與您輸入的T相同。

1

看起來T是您的返回類型,而S是一種在內部用作某個值的類型。

所以,你需要指定類型T和S,正是如此:

SomeType result = GetLookupValue<SomeType, SomeValueType>(...);