Отражение C #, используя MakeGenericMethod с методом, который имеет ограничение типа 'new ()' - PullRequest
3 голосов
/ 04 марта 2010

Я пытаюсь использовать MethodInfo MakeGenericMethod следующим образом:

        foreach (var type in types)
        {
            object output = null;
            var method = typeof (ContentTypeResolver).GetMethod("TryConstruct");
            var genmethod = method.MakeGenericMethod(type);
            var arr = new object[] { from, output };
            if ((bool)genmethod.Invoke(null, arr))
                return (IThingy)arr[1];
        }

Против следующего универсального метода:

    public static bool TryConstruct<T>(string from, out IThingy result) where T : IThingy, new()
    {
        var thing = new T();
        return thingTryConstructFrom(from, out result);
    }

Проблема в том, что я получаю исключение аргумента в строке MakeGenericMethod, так как тип, который я передаю, не является 'new ()'

Есть ли способ обойти это? Спасибо

1 Ответ

5 голосов
/ 04 марта 2010

Нет. Вы можете создавать только закрытые методы TryConstruct с параметрами типа, которые удовлетворяют ограничениям IThingy и new. В противном случае вы бы проиграли контракт TryConstruct: что произойдет, если вы позвоните в TryConstruct, и он достигнет линии new T()? не будет конструктором T (), поэтому вы нарушили бы безопасность типов.

Вам нужно проверить, что тип имеет открытый конструктор по умолчанию, прежде чем передавать его в MakeGenericMethod. Если вам нужно создавать экземпляры типов с помощью конструктора не по умолчанию, вам нужно создать новый метод или перегрузку TryConstruct, возможно такую, которая использует Activator.CreateInstance вместо new T().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...