gpt4 book ai didi

c# - Activator.CreateInstance 失败,出现 'No parameterless constructor'

转载 作者:行者123 更新时间:2023-11-30 18:59:42 32 4
gpt4 key购买 nike

我正在创建一个方法,该方法将使用 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);
}
}
}

关于c# - Activator.CreateInstance 失败,出现 'No parameterless constructor',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9146487/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com