作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在创建一个方法,该方法将使用 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/
我是一名优秀的程序员,十分优秀!