我知道一个天真的问题,经过两年的经验,我很难回答它。
我只需要创建一个泛型方法,这个方法可以采用int,double,float和比较它们并找到更大的值:
object ComapreMethod(object obj1, object obj2)
{
if(obj1 > obj2)
{
return obj1;
}
return obj2;
}
我想把它称为int,short,ushort,float,double,...等我真正坚持如何比较obj1和obj2我不能通过上面的方式写它 我知道这很天真,但我不知道
答案 0 :(得分:8)
好吧,您可以使用泛型更改方法签名:
TType ComapreMethod<TType>(TType obj1, TType obj2) where TType : IComparable
并将方法中的代码从if(obj1>obj2)
更改为if (obj1.CompareTo(obj2) > 0)
(并且不要忘记处理obj1和obj2为空的情况)。
在这种情况下,您将能够传递给某个实现IComparable
接口的类的方法值,包括整数,双精度和浮点数。
答案 1 :(得分:4)
有一个内置的解决方案可以做你想做的事情,Math.Max
(MSDN docs):
var myMax = Math.Max(input1, input2);
这适用于任何可以隐式转换为相同类型的不同类型input1和input2。因此,您可以互换使用int
,float
和double
,它将以适当的类型返回适当的值(例如,如果传递一个int和一个double,它将返回一个double))。
如果您想要修改您的方法以接受双打,也可以:
double CompareMethod(double obj1, double obj2)
{
if (obj1.CompareTo(obj2) > 0)
{
return obj1;
}
return obj2;
}
这再次使用隐式类型转换来使int成为双精度等等。这意味着你的返回类型总是一个double但是如果你想要返回int和int你可以创建重载并且编译器应该选择最好的一个
就个人而言,我建议你只使用内置的
答案 2 :(得分:1)
我认为你需要比较两种不同的类型。示例int和decimal。
static void Main(string[] args)
{
decimal p = 15.5m;
int q = 5;
Console.WriteLine(CompareTo<int, decimal, decimal>(q, p));
}
public static T3 CompareTo<T1, T2, T3>(T1 value1, T2 value2)
where T3:IComparable
{
T3 p = ConvertTo<T3>(value1);
T3 q = ConvertTo<T3>(value2);
if(p.CompareTo(q) >= 0)
{
return p;
}
else
{
return q;
}
}
public static T ConvertTo<T>(object value)
{
try
{
return (T)Convert.ChangeType(value, typeof(T), CultureInfo.InvariantCulture);
}
catch(Exception ex)
{
return (T)(typeof(T).IsValueType ? Activator.CreateInstance(typeof(T)) : null);
}
}
T1
是您的第一个值类型,T2
是您要比较的第二个值类型,T3
将是您期望的结果类型(十进制,双精度等)
答案 3 :(得分:0)
你可以用反射来做。我得到第一个类型并获得CompareTo
方法并运行它:
void Main()
{
float a = 2;
float b = 1;
ComapreMethod(a, b); // A > B
short c = 0;
short d = 3;
ComapreMethod(c, d); // A < B
int e = 1;
int f = 1;
ComapreMethod(e, f); // A == B
}
// you can change the return type as you wish
string ComapreMethod(object a, object b)
{
var result = Convert.ToInt32(a.GetType().GetMethods().First(o => o.Name == "CompareTo").Invoke(a, new object[] { b }));
if (result == 0)
return "A == B";
else if (result > 0)
return "A > B";
else if (result < 0)
return "A < B";
else
return "I don't know...";
}