Допустим, у меня есть метод:
public void ExampleMethod<T>(T x) where T : struct // or new()
{
// example usage, similar to what's actually happening
var z = (T)Enum.Parse(typeof(T), privateFieldOfTypeString);
// do something depending on values of x and z
// possibly using other methods that require them being enums
// or in case of the new() constraint:
// var t = new T() and do something together with x
}
, и я хочу использовать его следующим образом:
public void CallerMethod<S>(S y)
{
if (typeof(S).IsEnum) // or some other invariant meaning that `S` is "new()able"
{
ExampleMethod(y); // won't compile
}
}
Итак, во время выполнения я знаю, что S
удовлетворяетограничение для ExampleMethod<T>
.Я знаю, что это можно назвать с помощью отражения, что-то вроде:
this
.GetType()
.GetMethod(nameof(ExampleMethod<object>))
.MakeGenericMethod(typeof(S))
.Invoke(this, new object[] { y });
Возможно ли это без отражения?
Примечание: это упрощенный код из реального примера, и, очевидно, я не контролирую сигнатуры этих методов, поэтому ответы «добавить ограничение к CallerMethod
»и "удалить ограничение из ExampleMethod
" недопустимо.
Да, все это должно быть переработано, чтобы не возникала вся проблема.Но, как это часто бывает в реальной жизни, «все это» слишком велико, слишком тесно и слишком рискованно, чтобы переписывать.Некоторые требования изменились неожиданным образом - отсюда и очевидный запах кода, который я пытаюсь минимизировать, пряча его в одном неприятном месте.