根据C#中的输入类型提供不同的格式
本文关键字:格式 类型 输入 根据 | 更新日期: 2023-09-27 17:49:21
我正试图根据其类型输出一个值。目前,我正在创建一组基于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):
}
唯一的选择是避免泛型,并提供基于类型的显式方法重载:
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.点击此处了解更多信息,2.更多信息点击此处
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);
}
}
一种替代方案是维护一个将类型匹配为字符串格式的字典。
代码中有一项有点傻,但任何需要处理的其他类型都只需要在字典中多加一行:
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);
}
在该表扬的地方表扬,一个有着相似回答的类似问题。