2017-06-05 129 views
1

我在C#中使用泛型類型,我新使用泛型類型。所以,現在我陷入了一個問題。我有一些類這樣的:泛型類型的聲明方法

public class MyModel1 
{ 
} 

public class MyModel2 
{ 
} 

public class BaseClass<T> 
{ 
} 

public class ChildClass1 : BaseClass<MyModel1> 
{ 
} 

public class ChildClass2 : BaseClass<MyModel2> 
{ 
} 

public class AnotherClass 
{ 
    //What will be the syntax of declaring this method 
    //The syntax of the following method is wrong and incomplete. 
    //It's there just to give an idea about whai i want to do. 
    public void MyMethod<T>() 
     where T : BaseClass<..what to write..> 
    { 

    } 
} 

我的問題是什麼將是宣佈的MyMethod的語法是否正確,如果我想調用的MyMethod這樣的:

MyMethod<ChildClass1>(); 
+3

你的意思'其中T:BaseClass的'?還有方法缺少返回類型或void。 – Nkosi

+0

編輯並添加返回類型。不,看起來像'T:BaseClass '不是我正在尋找的。 –

回答

0

如果我理解正確,您嘗試過濾「MyMethod」,以便T是「ChildClass ...」類型的類。

可以通用的參數添加到您的函數是這樣的:

public void MyMethod<T, U>() 
where T : BaseClass<U> 
{ 

} 

但你要調用的MyMethod以這種方式。

MyMethod<ChildClass1, MyModel1>(); 

所以使用起來相當複雜。


另一種解決方案是創建一個新的 「空白」 類:

public abstract class Base // mark it as abstract if you don't need to use it in your code 
{ 
} 

public class MyModel1 
{ 
} 

public class MyModel2 
{ 
} 

public class BaseClass<T> : Base //The class inherits the new class 
{ 
} 

public class ChildClass1 : BaseClass<MyModel1> 
{ 
} 

public class ChildClass2 : BaseClass<MyModel2> 
{ 
} 

public class AnotherClass 
{ 
    public void MyMethod<T>() 
    where T : Base 
    { 
    } 
} 
+0

謝謝。我也在考慮同樣的事情(創建另一個基類)作爲備份計劃。我想我現在必須採取這種方式,直到我更好地掌握泛型並找到更好的解決方案(如果實際上有更好的解決方案)。 –

0

你忘了提回鍵入並在課程名稱後面添加<T>。例如,如果返回類型爲void,你可以聲明的方法:

 public void MyMethod<T>() 
     where T : BaseClass<T> 
{ 

} 
+0

編輯並添加返回類型。不,看起來像'T:BaseClass '不是我正在尋找的。 –

0

這將工作(我指的是它編譯)

public void MyMethod<T>() 
    where T : BaseClass<MyModel1> 
{ } 

那麼,這是否:

public void MyMethod<T>() 
    where T : ChildClass1 
{ } 

閱讀您的評論後

進一步編輯...

你可以這樣做:

public class AnotherClass<TBaseClass, TModel> where TBaseClass : BaseClass<TModel> 
{ 
    public void MyMethod(TBaseClass input) 
    { } 
} 

我對這個術語,希望不進攻。我稱之爲瘋狂的通用兔子洞。當我們試圖將泛型和繼承結合起來時,會發生什麼情況,以便一組類可以完成一系列變得越來越混亂的目標,並且我們通過添加更多通用參數和更通用的類來解決它。

到達孔的底部,如果你
- 使用<dynamic>
- 檢查,看看有什麼實際的類型是使用GetType()typeof,或is
- 得到它的編譯,但不記得是什麼感覺應該這樣做

+0

是的,他們工作。但是之後我需要爲所有MyModels(第一種方式)或所有ChildClasses(第二種方式)編寫MyMethod。這就是爲什麼我在尋找一些通用的東西 –