[英]Activator.CreateInstance(string) and Activator.CreateInstance<T>() difference
不,這不是關於泛型的問題。
我有一個帶有內部構造函數的幾個類的工廠模式(如果沒有通過工廠,我不希望它們被實例化)。
我的問題是CreateInstance
失敗了“沒有為此對象定義的無參數構造函數”錯誤,除非我在非公共參數上傳遞“true”。
例
// Fails
Activator.CreateInstance(type);
// Works
Activator.CreateInstance(type, true);
我想讓工廠變得通用,使其更簡單,如下所示:
public class GenericFactory<T> where T : MyAbstractType
{
public static T GetInstance()
{
return Activator.CreateInstance<T>();
}
}
但是,我無法找到如何傳遞“true”參數,以接受非公共構造函數(內部)。
我錯過了什么或者不可能嗎?
為了解決這個問題,你不能只改變你的使用方式:
public class GenericFactory<T> where T : MyAbstractType
{
public static T GetInstance()
{
return Activator.CreateInstance(typeof(T), true);
}
}
您的工廠方法仍然是通用的,但對激活器的調用不會使用泛型過載。 但是你仍然應該達到同樣的效果。
如果你絕對要求構造函數是私有的,你可以嘗試這樣的事情:
public abstract class GenericFactory<T> where T : MyAbstractType
{
public static T GetInstance()
{
return (T)Activator.CreateInstance(typeof(T), true);
}
}
否則你最好添加新約束並走這條路線:
public abstract class GenericFactory<T> where T : MyAbstractType, new()
{
public static T GetInstance()
{
return new T;
}
}
您是否嘗試將GenericFactory用作所有工廠的基類,而不是從頭開始編寫每個工廠?
除了Activator.CreateInstance(typeof(T),true)工作之外,T應該有默認的構造函數
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.