我有三個類——非常簡單的例子:
public class MyTableLayoutPanelBase : TableLayoutPanel
{
}
public class MyTableLayoutPanelExt : MyTableLayoutPanelBase
{
}
public class MyTableLayoutPanelUltraExt : MyTableLayoutPanelExt
{
}
Base 子類是 Microsoft WinForms TableLayoutPanel 控制元件的子類。然后我有一個 Ext 版本,它進一步繼承了我的 Base 類和一個 UltraExt,它繼承了 Ext 類。在我的實際使用中,Base、Ext 和 UltraExt 子類添加了一些超出繼承的屬性。為了便于討論,所有這些類都具有相同的實作......
我想要的是一個回傳這些子類物件之一的工廠。我采取的方法是這樣做:
public static object CreateMyTableLayoutPanelControl<T>()
{
if (typeof(T) == typeof(MyTableLayoutPanelControlBase))
{
return new MyTableLayoutPanelControlBase();
}
if (typeof(T) == typeof(MyTableLayoutPanelControlExt))
{
return new MyTableLayoutPanelControlExt();
}
if (typeof(T) == typeof(MyTableLayoutPanelControlUltraExt))
{
return new MyTableLayoutPanelControlUltraExt();
}
}
這讓我可以做這樣的事情:
var myTableLayoutPanelControlExt = (MyTableLayoutPanelExt)CreateMyTableLayoutPanelControl<MyTableLayoutPanelExt>();
問題是我需要將回傳的物件轉換為我需要的子型別別——我知道只要我轉換為我知道 CreateMyTableLayoutPanelControl 將回傳的三種型別之一,轉換就會成功。但這很笨拙,而且很昂貴。我寧愿從工廠收到我需要的正確型別的實際物件。
有沒有一種方法可以利用泛型以及我的類沒有實作介面以回傳不是物件而是在 CreateMyTableLayoutControl 泛型呼叫中請求的實際類實體這一事實?理想情況下,我希望這段代碼在沒有強制轉換的情況下作業:
MyTableLayoutPanelExt myTableLayoutPanelControlExt = CreateMyTableLayoutPanelControl<MyTableLayoutPanelExt>();
uj5u.com熱心網友回復:
您可以分兩步執行此操作:
首先,使用型別引數創建一個非泛型方法來完成繁重的作業:
public static MyTableLayoutPanelBase CreateMyTableLayoutPanelControl(Type t)
{
if (t == typeof(MyTableLayoutPanelBase))
{
return new MyTableLayoutPanelBase();
}
if (t == typeof(MyTableLayoutPanelExt))
{
return new MyTableLayoutPanelExt();
}
if (t == typeof(MyTableLayoutPanelUltraExt))
{
return new MyTableLayoutPanelUltraExt();
}
return null;
}
然后,您可以輕松地為您提供一個通用版本:
public static T CreateMyTableLayoutPanelControl<T>() where T : MyTableLayoutPanelBase
{
return (T)CreateMyTableLayoutPanelControl(typeof(T));
}
uj5u.com熱心網友回復:
您可以嘗試將Activator.CreateInstance函式與泛型一起使用,然后讓泛型型別與TableLayoutPanel您的基本型別進行約定TableLayoutPanel
public static T CreateMyTableLayoutPanelControl<T>()
where T : TableLayoutPanel
{
return Activator.CreateInstance<T>();
}
object除非必要,否則我不會從方法中回傳型別,因為它會導致一些問題。
時間:2019-04-01 標簽:c#fiddle
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/426092.html
