Использование универсального интерфейса в качестве параметра типа для метода или функции
Предполагая следующий интерфейс, который я использую, чтобы определить тип параметра и тип возвращаемого значения для хранимой процедуры...
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
}