В этом ответе не используется рефлексия, но может упростить работу с вашим кодом в некоторых обстоятельствах.
У нас может быть такой класс:
public class MyService
{
public void UpdateData<T>(Something data, Something otherData)
{
// do stuff
}
}
Позже мы обнаружим, что мы должны вызвать его, используя переменную Type
вместо общего аргумента, что может означать использование отражения.Иногда проще добавить неуниверсальную перегрузку к исходному классу и вызвать ее из универсального метода:
public class MyService
{
public void UpdateData(Type dataType, Something data, Something otherData)
{
// do stuff
}
public void UpdateData<T>(Something data, Something otherData)
{
UpdateData(typeof(T), data, otherData);
}
}
Мы теряем возможность легко налагать ограничения на аргумент Type
, как мы могли бы суниверсальный метод.Мы можем добавить проверку, если она нам понадобится.
Это максимально приблизит вас к коду, который вы пытаетесь написать:
_myService.UpdateData(dataType, editData, metaData);
Предполагается, что вы все еще нуждаетесь вуниверсальные методы вообще.Если вы добавите неуниверсальные перегрузки и обнаружите, что вы больше не вызываете общие, вы можете просто удалить их.
Значительным преимуществом по сравнению с рефлексией является то, что вы можете определить, где вызывается ваш код.Метод, который вызывается только с использованием отражения, будет казаться неиспользованным.