簡體   English   中英

Activator.CreateInstance失敗並顯示'No parameterless constructor'

[英]Activator.CreateInstance failing with 'No parameterless constructor'

我正在創建一個方法,它將使用CastleWindsor來嘗試解析一個類型,但如果沒有配置組件,則使用默認類型(所以我不需要配置所有內容,直到我真的想要更改實現)。 這是我的方法......

public static T ResolveOrUse<T, U>() where U : T
    {
        try
        {
            return container.Resolve<T>();
        }
        catch (ComponentNotFoundException)
        {
            try
            {
                U instance = (U)Activator.CreateInstance(typeof(U).GetType());
                return (T)instance;
            }
            catch(Exception ex)
            {
                throw new InvalidOperationException("IOC Couldn't instantiate a '" + typeof(U) + "' because: " + ex.Message);
            }
        }
    }

當WebConfigReader作為要使用的默認類型傳入時,我收到錯誤“沒有為此對象定義無參數構造函數”。 這是我的WebConfigReader類......

public class WebConfigReader : IConfigReader
{
    public string TfsUri
    {
        get { return ReadValue<string>("TfsUri"); }
    }

    private T ReadValue<T>(string configKey)
    {
        Type type = typeof(T).GetType();
        return (T)Convert.ChangeType(ConfigurationManager.AppSettings[configKey], type);
    }
}

由於我沒有ctor,它應該工作。 我添加了一個無用的ctor,我已經傳入了true作為CreateInstance的第二個參數,並且沒有上述工作。 我無法弄清楚我錯過了什么。 有什么想法嗎?

typeof(U)將返回U表示的類型。 對其執行額外的GetType()將返回類型System.Type ,該類型沒有默認構造函數。

所以你的第一個代碼塊可以寫成:

public static T ResolveOrUse<T, U>() where U : T
{
    try
    {
        return container.Resolve<T>();
    }
    catch (ComponentNotFoundException)
    {
        try
        {
            U instance = (U)Activator.CreateInstance(typeof(U));
            return (T)instance;
        }
        catch(Exception ex)
        {
            throw new InvalidOperationException("IOC Couldn't instantiate a '" + typeof(U) + "' because: " + ex.Message);
        }
    }
}

由於您具有泛型類型參數,因此您應該使用Activator.CreateInstance的泛型重載

U instance = Activator.CreateInstance<U>();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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