我有這個C#WinForms代碼,其中我有幾個不同的structs
,所有功能以相同的方式。所以,我試圖使用模板來代替編寫單獨的函數來添加或刪除項目。如何從模板調用方法?
例如,這裏是一個struct
和相應的List<>
我使用存儲其objects
:
public struct Alias
{
public string alias;
public string aliasSource;
public static bool IsValid(...); //This function exists in all the structs
};
List<Alias> aliases;
這從外部使用,添加別名功能:
public void AddAlias(Alias iAlias)
{
AddGenericStructItem<Alias>(iAlias, aliases);
}
這是實際添加的功能:
private void AddGenericStructItem<T>(T genericStructItem, List<T> genericList)
{
string outputError;
if (T.IsValid(genericStructItem, out outputError)) //< -- Problem in the 'T' being used in the far left
{
if (genericList.Contains(genericStructItem))
{
MessageBox.Show("ERROR 82ha5jb :: Item already exists");
}
else
{
genericList.Add(genericStructItem);
}
}
else
{
MessageBox.Show(outputError);
}
}
問題發生在T.IsValid...
部分。編譯器給我的T
以下錯誤:
'T' is a 'type parameter', which is not valid in the given context
有沒有解決這個辦法嗎?我所有的structs
都有一個IsValid
函數,它們具有相同的設置,所以如果我不在這裏使用模板,反覆編寫相同的代碼似乎很愚蠢......
C#泛型與C++中的模板明顯不同,儘管語法看起來很相似。 –
我感興趣的是爲什麼IsValid()是靜態的。我希望稱爲IsValid()的方法需要訪問該對象。 – itsme86
是的,這是一種看待它的方式,我猜。我使用它的方式是當我需要驗證輸入本身時(基於哪個結構實例在以後創建),所以驗證需要事先發生,這就是爲什麼在這種情況下需要靜態方法。 – Ahmad