簡體   English   中英

Activator.CreateInstance(string)和Activator.CreateInstance <T> () 區別

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM