代码之家  ›  专栏  ›  技术社区  ›  Dib

使用泛型接口作为方法或函数的类型参数

  •  2
  • Dib  · 技术社区  · 9 年前

    假设下面的接口用于定义存储过程的参数类型和返回类型。。。

    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 回复  |  直到 9 年前
        1
  •  4
  •   Jon Skeet    9 年前

    您需要在指定接口的位置使用类型参数:

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

    …否则,您指的是非泛型 IStoredProcedure 界面(不要忘记,C#允许泛型arity“重载”类型。)

        2
  •  1
  •   nickm    9 年前
    public static void DoAction<TProcedure, TReturnType, TParameterType>(TProcedure procedure1)
            where TProcedure : IStoredProcedure<TReturnType, TParameterType>
            where TReturnType : class
            where TParameterType : class
            {
                // do some work
            }
    
    推荐文章