Я думаю, что этого нужно, вероятно, избежать, если это возможно, в пользу идентификатора, который на самом деле описывает, каково это!
на Этот вопрос трудно ответить, потому что это абстрактно. Я мог бы, например, рассмотреть вызов основы MyClassA и MyClassB, "MyClass".
Можно, но это включает отражение, но вы можете это сделать.
typeof(ClassExample)
.GetMethod("DoSomething")
.MakeGenericMethod(p.DisplayType)
.Invoke(this, new object[] { p.Name, p.Value });
Это будет смотреть на верхнюю часть содержащего класса, получать информацию о методе, создавать общий метод с соответствующими введите, затем вы можете вызвать Invoke на нем.
this.GetType().GetMethod("DoSomething").MakeGenericMethod(p.Value.GetType()).Invoke(this, new object[]{p.Name, p.Value});
Должно работать.
Типы универсальных типов нельзя указать во время выполнения так, как вы хотели бы здесь.
Простейшими вариантами было бы добавить неуниверсальную перегрузку DoSomething
, или просто вызовите DoSomething
и проигнорируйте p.DisplayType
. Если SendToDatabase
не зависит от времени компиляции типа значения
(а это, вероятно, не должно), не должно быть ничего плохого в том, чтобы дать ему объект
.
Если вы не можете этого сделать, вам придется вызвать DoSomething
с помощью отражения, и это сильно снизит производительность.
Сначала нам нужно преобразовать 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 });
Строго говоря, для этого можно использовать MethodInfo.MakeGenericMethod .
Но я рекомендую вместо этого изменить DoSomething на неуниверсальную форму, поскольку не очевидно, действительно ли она должна быть универсальной.