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)
但是当我的类中包含此属性时,编译器会在运算符上引发逻辑错误-.
我能做些什么来正常实现这个目标,还是应该忽略它?
尝试这样的事情:
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.
对于C#中的泛型,这是不可能的 - 至少不是直接的.长期以来,它一直是Connect上一项备受关注的功能.
您需要使您的类型实现一些具有可以使用的成员的接口,并将类约束到该类,或者使用Connect错误中列出的解决方法之一(没有一个是完美的),或者使用单独的方法MiscUtil的通用运算符.