Как назвать общий метод с данным Текстовым объектом? [дубликат]

Фиктивные столбцы являются хорошей идеей, если можно предсказать их тип (и сделать их nullable). Проверьте, как Ваши дескрипторы механизма устройства хранения данных аннулируют.

MyISAM заблокирует все, если Вы даже упомянете имя таблицы мимоходом, по телефону, в аэропорту. Это просто делает это...

Однако блокировки не являются действительно настолько большими соглашение; пока Вы не пытаетесь добавить значение по умолчанию для нового столбца к каждой строке, но позволить ему находиться как пустой указатель, и Ваш механизм устройства хранения данных достаточно умен не пойти, пишущий его, необходимо согласиться с блокировкой, которая, как только сохранилось, достаточно долго обновляет метаданные. Если Вы действительно пытаетесь записать новое значение, ну, в общем, Вы - тост.

53
задан codymanix 10 September 2009 в 11:47
поделиться

3 ответа

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

public class Example {

    public void CallingTest()
    {
        MethodInfo method = typeof (Example).GetMethod("Test");
        MethodInfo genericMethod = method.MakeGenericMethod(typeof (string));
        genericMethod.Invoke(this, null);

    }

    public void Test<T>()
    {
        Console.WriteLine(typeof (T).Name);
    }
}

Имейте в виду, что это очень хрупко, я бы предпочел найти другой шаблон для вызова вашего метода.

Еще одно хакерское решение (возможно, кто-то сможет сделать его немного чище) было бы использовать некоторую магию выражения:

public class Example {

    public void CallingTest()
    {
        MethodInfo method = GetMethod<Example>(x => x.Test<object>());
        MethodInfo genericMethod = method.MakeGenericMethod(typeof (string));
        genericMethod.Invoke(this, null);

    }

    public static MethodInfo GetMethod<T>(Expression<Action<T>> expr)
    {
        return ((MethodCallExpression) expr.Body)
            .Method
            .GetGenericMethodDefinition();
    }

    public void Test<T>()
    {
        Console.WriteLine(typeof (T).Name);
    }
}

Обратите внимание на передачу 'объекта' идентификатор типа как аргумент универсального типа в лямбде. Не мог так быстро понять, как это обойти. В любом случае, я думаю, это безопасно во время компиляции. Просто это почему-то кажется неправильным: /

56
ответ дан 7 November 2019 в 08:48
поделиться

К сожалению, вам нужно использовать отражение (по причинам, упомянутым Джаредом). Например:

MethodInfo method = typeof(Foo).GetMethod("MyGenericMethod");
method = method.MakeGenericMethod(t);
method.Invoke(this, new object[0]);

Очевидно, что на самом деле вам нужно больше проверять ошибки :)


Боковое примечание: мой локальный MSDN не указывает, что параметр из MakeGenericMethod является массивом параметров, поэтому я ожидал, что потребует:

method = method.MakeGenericMethod(new Type[] { t });

но кажется, что является массивом параметров в действительности, и онлайн-документы MSDN соглашаются. Нечетный.

18
ответ дан 7 November 2019 в 08:48
поделиться

Такой подход не работает. Причина в том, что Type - это объект, тип которого определяется во время выполнения. Однако вы пытаетесь использовать его для вызова универсального метода. Тип вызова универсального метода устанавливается во время компиляции. Следовательно, объект Type нельзя использовать в качестве параметра типа в универсальном методе.

-2
ответ дан 7 November 2019 в 08:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: