我试图根据其类型输出值。目前我正在根据T的类型创建一堆if语句。是否有更好的解决方案使代码看起来更简洁?
public static void Output<T>(T data)
{
string dataStr = data.ToString();
if (typeof (T) == typeof(double))
{
dataStr = String.Format("{0:N4}", data);
}
Console.WriteLine(dataStr):
}
答案 0 :(得分:3)
唯一的选择是避免泛型并根据类型提供显式方法重载:
public static void Output(Double data) { Console.WriteLine( "{0:N4}", data ); }
public static void Output(String data) { Console.WriteLine( "{0}", data ); }
public static void Output(Int32 data) { Console.WriteLine( "{0:G}", data ); }
// ...and so on
注意这种方法的缺点是过载选择是在编译时完成的,而不是运行时,所以这会失败:Output( (Object)someInt32Value );
答案 1 :(得分:0)
它的击球选项是重载,
<强>多形性:强>
当消息可以以不同方式处理时称为多态。多态性意味着多种形式。
多态性是OOP的基本概念之一。
多态性提供以下功能:
它允许您在运行时通过基类引用调用派生类的方法。 它具有使类能够提供通过相同名称调用的方法的不同实现的能力。
多态性有两种类型:
编译时间多态/重载 运行时多态性/覆盖
编译时间多态性
编译时多态是方法和运算符重载。它也被称为早期绑定。
在方法重载方法中,在不同的输入参数下执行不同的任务。
运行时多态性
运行时多态性是使用继承和虚函数完成的。方法重写称为运行时多态。它也被称为后期绑定。
覆盖方法时,可以更改派生类的方法行为。重载方法只需要使用相同原型的另一种方法。
警告:不要使用方法覆盖来混淆方法重载,它们是不同的,无关的概念。但它们听起来很相似。
方法重载与继承或虚方法无关。
1. More info click here, 2. More info click here
using System;
class Test
{
static void Foo(int x, int y)
{
Console.WriteLine("Foo(int x, int y)");
}
static void Foo(int x, double y)
{
Console.WriteLine("Foo(int x, double y)");
}
static void Foo(double x, int y)
{
Console.WriteLine("Foo(double x, int y)");
}
static void Main()
{
Foo(5, 10);
}
}
答案 2 :(得分:0)
一种替代方法是维护一个与Types匹配的字典来格式化字符串。
代码对于一个项目来说有点愚蠢,但是任何需要处理的其他类型只需要字典中的额外行:
public static void Output<T>(T data)
{
var formats = new Dictionary<Type, string>
{
{typeof (Double), "{0:N4}"}
};
var format = formats.Where(x => x.Key == typeof(T))
.Select(x => x.Value).SingleOrDefault();
string dataStr = data.ToString();
if (format != null)
dataStr = String.Format(format, data);
Console.WriteLine(dataStr);
}