Использование универсального интерфейса в качестве параметра типа для метода или функции

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

public interface IStoredProcedure<out TReturn, out TParameter>
    where TReturn : class 
    where TParameter : class
{
    TReturn ReturnType { get; }

    TParameter ParameterType { get; }
}

... возможно ли передать этот интерфейс как TypeParameter для метода? Что-то вроде этого (что не компилируется)

public static void DoAction<TProcedure>(TProcedure procedure1)
        where TProcedure : IStoredProcedure<TReturnType, TParameterType>
{
        // do some work
}

... или что-то в этом роде...

public static void DoAction<IStoredProcedure<TReturnType, TParameterType>>(IStoredProcedure procedure1)
        where TReturnType : class
        where TParameterType : class
{
        // do some work
}

ни один из этих двух методов не компилируется, и я просто не могу понять, как их написать, чтобы они компилировались. в DoAction() Метод мне нужно, чтобы соединить типы параметров и тип возвращаемого значения.

2 ответа

Решение

Вам нужно использовать аргументы типа, где вы указываете интерфейс:

public static void DoAction<TReturnType, TParameterType>
   (IStoredProcedure<TReturnType, TParameterType> procedure1)
    where TReturnType : class
    where TParameterType : class
{
    // do some work
}

... в противном случае вы имеете в виду не универсальный IStoredProcedure интерфейс. (Не забывайте, что C# позволяет типам "перегружаться" универсальной арностью.)

public static void DoAction<TProcedure, TReturnType, TParameterType>(TProcedure procedure1)
        where TProcedure : IStoredProcedure<TReturnType, TParameterType>
        where TReturnType : class
        where TParameterType : class
        {
            // do some work
        }
Другие вопросы по тегам