C# Activator.CreateInstance因';无参数构造函数';

C# Activator.CreateInstance因';无参数构造函数';,c#,C#,我正在创建一个方法,该方法将使用CastleWindsor尝试解析类型,但如果组件未配置,则使用默认类型(因此,在我真正想要更改实现之前,我不必配置所有内容)。这是我的方法 public static T ResolveOrUse<T, U>() where U : T { try { return container.Resolve<T>(); } catch (Compon

我正在创建一个方法,该方法将使用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);
            }
        }
    }
publicstatict解析器使用(),其中U:T
{
尝试
{
返回container.Resolve();
}
捕获(ComponentNotFoundException)
{
尝试
{
U instance=(U)Activator.CreateInstance(typeof(U).GetType());
返回(T)实例;
}
捕获(例外情况除外)
{
抛出新的InvalidOperationException(“IOC无法实例化“+typeof(U)+”因为“+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);
    }
}
公共类WebConfigReader:IConfigReader
{
公共字符串TfsUri
{
获取{return ReadValue(“TfsUri”);}
}
私有T读取值(字符串配置键)
{
Type Type=typeof(T).GetType();
返回(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);
        }
    }
}
publicstatict解析器使用(),其中U:T
{
尝试
{
返回container.Resolve();
}
捕获(ComponentNotFoundException)
{
尝试
{
U instance=(U)Activator.CreateInstance(typeof(U));
返回(T)实例;
}
捕获(例外情况除外)
{
抛出新的InvalidOperationException(“IOC无法实例化“+typeof(U)+”因为“+ex.Message”);
}
}
}

因为您有一个泛型类型参数,所以您应该只使用
Activator.CreateInstance的泛型重载

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

typeof(U).GetType()
GetType()是多余的。WebConfigReader不会按原样编译,你的真实代码是什么样子的?@Baboon它不是多余的;这是不正确的。typeof(U)返回一个表示U类型的对象,但该对象的类型是System.type,因此GetType调用返回的type对象是表示System.type的对象,而不是表示U的对象。@phoog这是我想说的,但它是深夜。
ReadValue()中也存在同样的错误
method-只需使用
typeof(U)
我认为否决票是因为你没有提供答案。你说的是OP不想要的,但不是OP想要的。@M.Babcock:这是我的猜测,我可能是对的,因为你编辑了这篇文章,否决票消失了。一般来说,“不要做X”应该是一个注释;“用Y代替X”应该是一个答案。你知道为什么通用版本只支持无参数构造函数吗?@Gabe我不确定。但是它的主要用途之一是支持
new()
约束,因此它只需要支持参数。无法指定带参数的构造函数可能是
CreateInstance
无法指定的一个原因