Activator.CreateInstance работает в одном методе, но создает исключение AmbiguousMatchException в другом - PullRequest
0 голосов
/ 07 октября 2018

У меня есть два универсальных метода в одном классе, и каждый использует абсолютно один и тот же код для создания экземпляров.Один работает, другой создает исключение AmbiguousMatchException.Вот код:

private static Dictionary<Type, AccessBase> _dictionary;

public static T Access<T>(Type type) where T : AccessBase
{
    T instantiated;

    if (_dictionary.ContainsKey(type))
    {
        instantiated = _dictionary[type] as T;
    }
    else
    {
        instantiated = (T)Activator.CreateInstance(type, _manager); //<- Works!
        _dictionary.Add(type, instantiated);
    }

    return instantiated;
}        

public static void RegisterAccess<T>(Type type) where T : AccessBase
{
    if (type == null)
    {
        throw new ArgumentNullException(nameof(type));
    }

    if (_dictionary.ContainsKey(type))
    {
        return;
    }

    var instantiated = (T)Activator.CreateInstance(type, _manager); //<- Fails!
    if (instantiated == null)
    {
        throw new ArgumentException($"{nameof(type)} cannot be registered");
    }

    _dictionary.Add(type, instantiated);
}

Я бы приветствовал любые предложения о том, почему и что с этим делать ... Я рвал на себе то, что осталось от моих волос!

1 Ответ

0 голосов
/ 07 октября 2018

Спасибо всем вам за ваш вклад.Я наконец нашел проблему, которая, как оказалось, на самом деле довольно проста.В точке сбоя значение поля _manager равно нулю ... Как только оно больше не равно нулю, оно работает.

Чтобы перехватить это, я попытался вызвать первый метод одновременно со вторыми оба не смогли.Проследив за этим, я определил, что причиной было нулевое значение, поскольку, если вы сделаете это позже в процессе, он будет работать нормально.

Первоначальная цель кода состояла в том, чтобы предварительно зарегистрировать классы доступа, чтобы приони нужны, они готовы пойти и избежать постоянных «новых» вызовов для генерации этих классов по мере необходимости.Учитывая, что теперь ясно, что это не может произойти в тот момент, вопрос заключается в том, требуется ли это вообще.Если мы сделаем это на более позднем этапе, у нас не будет особой причины, поскольку это будет повторяться каждый раз, когда база данных открывается, а каждая из них не добавляется, поскольку она уже существует.

Я думаю, что в конечном итоге мы откажемся от процесса, который использует второй метод, предварительную регистрацию, в пользу первого метода, который уже используется в любом случае и который автоматически добавляет созданные экземпляры классов только тогда, когда они необходимы икоторый уже работает нормально на более позднем этапе.

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