根据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):
    }

根据C#中的输入类型提供不同的格式

唯一的选择是避免泛型,并提供基于类型的显式方法重载:

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);
}

在该表扬的地方表扬,一个有着相似回答的类似问题。