Общий метод, Выполняемый с типом выполнения [дубликат]

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

на Этот вопрос трудно ответить, потому что это абстрактно. Я мог бы, например, рассмотреть вызов основы MyClassA и MyClassB, "MyClass".

30
задан Sarit 22 October 2009 в 12:46
поделиться

5 ответов

Можно, но это включает отражение, но вы можете это сделать.

typeof(ClassExample)
    .GetMethod("DoSomething")
    .MakeGenericMethod(p.DisplayType)
    .Invoke(this, new object[] { p.Name, p.Value });

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

37
ответ дан 27 November 2019 в 23:59
поделиться
this.GetType().GetMethod("DoSomething").MakeGenericMethod(p.Value.GetType()).Invoke(this, new object[]{p.Name, p.Value});

Должно работать.

5
ответ дан 27 November 2019 в 23:59
поделиться

Типы универсальных типов нельзя указать во время выполнения так, как вы хотели бы здесь.

Простейшими вариантами было бы добавить неуниверсальную перегрузку DoSomething , или просто вызовите DoSomething и проигнорируйте p.DisplayType . Если SendToDatabase не зависит от времени компиляции типа значения (а это, вероятно, не должно), не должно быть ничего плохого в том, чтобы дать ему объект .

Если вы не можете этого сделать, вам придется вызвать DoSomething с помощью отражения, и это сильно снизит производительность.

3
ответ дан 27 November 2019 в 23:59
поделиться

Сначала нам нужно преобразовать p.Value в правильный тип, поскольку даже если мы знаем тип во время компиляции, мы не можем передать строку прямо в метод ...

DoSomething<Int32>( "10" ); // Build error

Для простых числовые типы и DateTime, мы можем использовать

object convertedValue = Convert.ChangeType(p.Value, p.DisplayType);

Теперь мы можем использовать отражение для вызова необходимого универсального метода ...

typeof(ClassExample)
    .GetMethod("DoSomething")
    .MakeGenericMethod(p.DisplayType)
    .Invoke(this, new object[] { p.Name, convertedValue });
3
ответ дан 27 November 2019 в 23:59
поделиться

Строго говоря, для этого можно использовать MethodInfo.MakeGenericMethod .

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

1
ответ дан 27 November 2019 в 23:59
поделиться
Другие вопросы по тегам:

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