Как обойти проверку компилятором ограничения "где" метода C # - PullRequest
0 голосов
/ 21 сентября 2018

Библиотека, которую я использую, содержит этот метод:

T TheirMethod<T>() where T : Base; // T must inherit from Base

В моем коде есть этот метод:

T MyMethod<T>() // it can be any T here
{
    if (!typeof(T).IsSubclassOf(typeof(Base)))
        throw new Exception("I'm fine with crashing at runtime here");
    return x.TheirMethod<T>(); // DOES NOT COMPILE
}

Конечно, это не компилируется, потому что компиляторне достаточно умен, чтобы статически доказать, что мой T является Base.(Я не могу добавить ограничение where к MyMethod, потому что оно реализует другой сторонний интерфейс.)

Мой вопрос: как я могу это вызвать в любом случае?Я бы хотел, чтобы эта проверка была выполнена во время выполнения.

Ответы [ 2 ]

0 голосов
/ 21 сентября 2018

Вы можете использовать Reflection для вызова метода.Но вы должны учитывать производительность Влияние отражения.

T MyMethod<T>()
{
    if (!typeof(T).IsSubclassOf(typeof(Base)))
        throw new Exception("I'm fine with crashing at runtime here");

    return (T) typeof(TheirClass).GetMethod("TheirMethod").MakeGenericMethod(typeof(T)).Invoke(x, null);
}
0 голосов
/ 21 сентября 2018

Используйте специальный тип dynamic, который задерживает проверку ограничений типов до времени выполнения:

return ((dynamic)x).TheirMethod<T>();

(я разобрался с ответом на полпути, написав свой вопрос, но все равно отправляю его, вможет кому-то пригодится.)

...