如何动态创建没有无参数构造函数的类的实例?

时间:2010-11-05 22:10:23

标签: c# reflection

我正在尝试制作这样的扩展方法:

public static T Optional<T>(this T obj)
{
    return obj != null ? obj : Activator.CreateInstance<T>();
}

但是,如果该类型没有无参数构造函数,则会失败。有没有一种方法可以在没有无参数构造函数的情况下获取对象的实例?

注意:我不想放置where T : new()并将方法限制为只使用无参数构造函数的类。

2 个答案:

答案 0 :(得分:2)

答案 1 :(得分:0)

您可以创建工厂方法来创建对象的实例。如果它没有默认构造函数,请提供参数。像这样:

public static class Factories
{
    public static Func<T> GetInstanceFactory<T>(params object[] args)
    {
        var type = typeof(T);
        var ctor = null as System.Reflection.ConstructorInfo;
        if (args != null && args.Length > 0)
            ctor = type.GetConstructor(args.Select(arg => arg.GetType()).ToArray());
        if (ctor == null)
            ctor = type.GetConstructor(new Type[] { });
        if (ctor == null)
            throw new ArgumentException("Cannot find suitable constructor for object");
        return () => (T)ctor.Invoke(args.ToArray());
    }
}

// usage
var oooooFactory = Factories.GetInstanceFactory<string>('o', 5); // create strings of repeated characters
oooooFactory(); // "ooooo"