Как динамически создать экземпляр класса, который не имеет конструктора без параметров? - PullRequest
1 голос
/ 06 ноября 2010

Я пытаюсь создать метод расширения, подобный следующему:

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

Тем не менее, он завершится неудачно, если для типа нет конструктора без параметров.Есть ли способ получить экземпляр объекта без конструктора без параметров?

ПРИМЕЧАНИЕ. Я не хочу ставить where T : new() и ограничивать метод только классами с конструкторами без параметров.

Ответы [ 2 ]

2 голосов
/ 06 ноября 2010
0 голосов
/ 06 ноября 2010

Вы можете создать фабричный метод для создания экземпляров ваших объектов. Если у него нет конструктора по умолчанию, укажите аргументы. Примерно так:

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"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...