如何在C#中减去两个通用对象(T-T)(例如:DateTime - DateTime)?

Rez*_*eni 13 c# generics properties generic-programming

我写了一个通用类:

public class Interval<T> where T : IComparable // for checking that Start < End 
{
    public T Start { get; set; }
    public T End { get; set; }
    ...
}
Run Code Online (Sandbox Code Playgroud)

我使用这个类与DateTime,int等.

我需要一个Duration属性,返回一个持续时间,如:

public object Duration
{
    get
    {
        return End - Start;
    }
}
Run Code Online (Sandbox Code Playgroud)

但是当我的类中包含此属性时,编译器会在运算符上引发逻辑错误-.

我能做些什么来正常实现这个目标,还是应该忽略它?

Pro*_*FOX 8

尝试这样的事情:

static void Main(string[] args)
{
    Tuple<int, bool> value = JustAMethod<int>(5, 3);
    if (value.Item2)
    {
        Console.WriteLine(value.Item1);
    }
    else
    {
        Console.WriteLine("Can't substract.");
    }
}
public static Tuple<T, bool> JustAMethod<T>(T arg1, T arg2)
{
    dynamic dArg1 = (dynamic)arg1;
    dynamic dArg2 = (dynamic)arg2;
    dynamic ret;
    try
    {
        ret = dArg1 - dArg2;
        return new Tuple<T, bool>(ret, true);
    }
    catch
    {
        return new Tuple<T, bool>(default(T), false);
    }
}
Run Code Online (Sandbox Code Playgroud)

这是如何工作的:首先,您将参数转换为动态类型,并且您可以轻松地在动态类型上使用运算符。如果您无法使用这些运算符,则将在运行时抛出异常。因此,如果您尝试减去实际上无法减去的两个对象,我们将捕获异常并false作为Tuple.


Ree*_*sey 7

对于C#中的泛型,这是不可能的 - 至少不是直接的.长期以来,它一直是Connect上一项备受关注的功能.

您需要使您的类型实现一些具有可以使用的成员的接口,并将类约束到该类,或者使用Connect错误中列出的解决方法之一(没有一个是完美的),或者使用单独的方法MiscUtil的通用运算符.