具有可用计数的通用类型

时间:2015-08-18 12:47:46

标签: c# generics

我正在使用泛型类型测试C#中的多态性,并试图找到使泛型可数的方法,但C#编译器不接受诸如泛型类型求和之类的操作。我发现了一个解决方法,我在下面创建了代码,该代码继承自提供正确功能的接口:

using System.IO;
using System;

interface ICountable<T>
{
    T Add(T a, T b);
    T Multiply(T a, T b);
}

interface IExecute<T> : ICountable<T>
{
    T Operation(T a, T b);
}

class IntSum : IExecute<int>
{
    public int Add(int a, int b)
    {
        return a + b;
    }
    public int Multiply(int a, int b)
    {
        return a*b;
    }
    public int Operation(int a, int b)
    {
        return Add(a,b);
    }
}
class DoubleMultiply : IExecute<double>
{
    public double Add(double a, double b)
    {
        return a + b;
    }
    public double Multiply(double a, double b)
    {
        return a*b;
    }
    public double Operation(double a, double b)
    {
        return Multiply(a,b);
    }
}

class Program
{
    static void Main()
    {
        Console.WriteLine(DoOperation(new IntSum(), 1, 2));
        Console.WriteLine(DoOperation(new DoubleMultiply(), 3.5d, 3d));
    }

    static TResult DoOperation<TOperand, TResult>(TOperand obj, TResult a, TResult b)
    where TOperand : IExecute<TResult>
    {
        return obj.Operation(a,b);
    }
}

上面的代码可以工作,但最后我使用继承到具体的原始类型,并且有很多冗余的代码块。我的最终目标是尽可能地使这些类型更通用,类似于:

using System.IO;
using System;

interface ICountable<T>
{
    T Add(T a, T b);
    T Multiply(T a, T b);
}

interface IExecute<T> : ICountable<T>
{
    T Operation(T a, T b);
}

// Generic code
class Sum<T> : IExecute<T>, ICountable<T>
{
    public T Add(T a, T b)
    {
        return a + b;
    }
    public T Multiply(T a, T b)
    {
        return a*b;
    }
    public T Operation(T a, T b)
    {
        return Add(a,b);
    }
}

class Program
{
    static void Main()
    {
        //Console.WriteLine(DoOperation(new IntSum(), 1, 2));
        //Console.WriteLine(DoOperation(new DoubleMultiply(), 3.5d, 3d));
    }

    //static TResult DoOperation<TOperand, TResult>(TOperand obj, TResult a, TResult b)
    //where TOperand : IExecute<TResult>
    //{
    //    return obj.Operation(a,b);
    //}
}

显然,编译器抱怨因为它不能求和两种泛型类型。你认为我总是要继承特定的原语吗?感谢。

1 个答案:

答案 0 :(得分:0)

您可以使用Expression.Add()和Expression.Multiply()来实现此目的。请注意,如果没有为您使用的类型定义加法/乘法运算符,它们将抛出异常。