我对SO和Google进行了相当多的研究。我的C#应用程序需要能够处理long,decimal和float类型的结果。我一直在探索制作通用接口的选项,然后关闭每种结果类型。关闭通用接口的类的实例不能隐式转换为通用接口类型的成员
下面是示例代码:
using System;
interface IResult<T>
{
T Result();
void Increment(T value);
}
public class ResultLong : IResult<long>
{
private long result;
public long Result()
{
return result;
}
public void Increment(long value)
{
result += value;
}
}
public class App<T> where T : IConvertible
{
private IResult<T> result;
public void Run()
{
result = new ResultLong();
}
}
这给出了错误:
Cannot implicitly convert type 'ResultLong' to 'IResult'. An explicit conversion exists (are you missing a cast?)
添加铸造修复编译器错误,但随后的增量方法抛出:
Cannot convert from int to T.
public void Run()
{
result = (IResult<T>)new ResultLong();
result.Increment(500);
}
请让我知道如果这种整体方法是有效的,如果是这样,我可以如何使它工作。如果这是一种无效的方法,你推荐什么?
谢谢! 阿隆
我还要提到的,这是我目前如何处理它:
using System;
public class Result
{
public long ResultLong { get; set; }
public decimal ResultDecimal { get; set; }
public double ResultFloat { get; set; }
public DateTime ResultDateTime { get; set; }
public void Increment<T>(T value) where T : IConvertible
{
if (value is int || value is long)
{
ResultLong += value.ToInt64(null);
}
else if (value is decimal)
{
ResultDecimal += value.ToDecimal(null);
}
else if (value is double)
{
ResultFloat += value.ToDouble(null);
}
else if (value is DateTime)
{
ResultDateTime = value.ToDateTime(null);
}
}
}
我应该进一步提的是寻找到的意见后,我决定去与基本方法重载和该应用似乎目前工作正常。
public void Increment(int value)
{
ResultLong += value;
}
public void Increment(long value)
{
ResultLong += value;
}
public void Increment(double value)
{
ResultDouble += value;
}
public void Increment(decimal value)
{
ResultDecimal += value;
}
public void Increment(DateTime value)
{
ResultDateTime = value;
}
S.O.一直是我学习C#时克服许多障碍的主要指南。这是我的第一个问题,我非常感谢大家的回应。
在'App'中,'T'不一定是'long'。它可以很容易地是“小数”或“布尔”。攻击类似问题的一般方法(从未很好,可能在您的具体情况下不可用)将从非泛型'IResult'派生'IResult ',并在'App '中使用。或者写一个具体的'Result '类实现'IResult ',然后做'public void Run(){result = new Result ; }' - 但只有当两个'T'都是相同'T';不清楚是否如此。 –
请检查'Run()';)的工厂方法设计模式。 –
感谢您的提示。我会研究你的建议! – Aron