【问题标题】:Automatic type Conversion in C#C#中的自动类型转换
【发布时间】:2011-06-13 18:04:01
【问题描述】:

我知道你可以重写一个对象的 ToString() 方法,这样每次你调用一个对象或将它传递给一个需要 String 类型的函数时,它都会被转换为 String。

我已经为对象类型'object'写了几个扩展方法

public static DateTime ToDate(this object date)
{
    return DateTime.Parse(date.ToString());
}

public static int ToInteger(this object num)
{
    return Int32.Parse(num.ToString());
}

public static long ToLong(this object num)
{
    return Int64.Parse(num.ToString());
}

这样我就可以这样称呼他们:

eventObject.Cost = row["cost"].ToString();
eventObject.EventId = row["event_id"].ToLong();

但是,我想要完成的是根据我的“eventObject”上的属性类型将“object”类型的行对象转换为正确的类型。所以,我可以这样称呼它:

eventObject.Cost = row["cost"];
eventObject.EventId = row["event_id"];

如果重要的话,该行是一个 DataRow。

【问题讨论】:

  • 你为什么不直接使用 Convert 类? msdn.microsoft.com/en-us/library/system.convert.aspx - 不,你不能像最后一个代码那样进行静默类型转换,除非你让“row[x]”返回一个知道如何进行隐式转换的自定义对象。
  • +1 @Lasse 使用 Convert 类比使用实用方法填充 Object 更可取。
  • 现在会用,觉得没啥区别

标签: c# .net casting type-conversion overriding


【解决方案1】:

C# 支持类型的implicit 转换,您可以将它用于您的自定义类型,如下所示:

 class CustomValue
 {
     public static implicit operator int(CustomValue v)  {  return 4;  }

     public static implicit operator float(CustomValue v) {  return 4.6f;  }
 }

 class Program
 {
     static void Main(string[] args)
     {
         int x = new CustomValue(); // implicit conversion 
         float xx = new CustomValue(); // implicit conversion 
     }
 }

并支持extension methods,但支持隐式转换作为扩展方法,如下所示:

static class MyExtension
{
    // Not supported
    public static implicit operator bool(this CustomValue v)
    {
        return false;
    }
}

【讨论】:

  • 我可以为 System.Data.DataRow 添加隐式运算符吗?
  • 不,你不能,因为它只有用户定义的类型可用。
  • 你可以结合它是一个ToCustomValue扩展方法
【解决方案2】:

我知道你可以覆盖 对象的 ToString() 方法,这样 每次调用对象或传递 它需要一个功能 字符串类型它将被转换为 字符串。

不,你错了。以下代码无法编译:

class MyClass
{
    public override string ToString()
    {
        return "MyClass";
    }
}

static void MyMethod(string s) { }

static void Main(string[] args)
{
    MyMethod(new MyClass());   //compile error
}

编译器不会先获取MyMethod参数的类型(即string),并尝试将您传递的参数(其类型为MyClass)转换为它。我猜你可能被Console.WriteLine 之类的东西误导了。基于上面的代码, Console.WriteLine(new MyClass()) 将“MyClass”打印到控制台,似乎编译器知道您应该将字符串传递给Console.WriteLine 并尝试转换MyClass 到字符串。但最重要的是Console.WriteLine有几个重载,其中一个是object

//from Console.cs
public static void WriteLine(object value)
{
    //in this method there is something like
    //Console.WriteLine(value.ToString());
}

【讨论】:

    【解决方案3】:

    我相信您正在寻找的是隐式转换,如下所述:http://msdn.microsoft.com/en-us/library/z5z9kes2.aspx

    但是,将这些添加到对象中将是一个非常糟糕的主意,原因已在我链接到的页面中列出。

    【讨论】:

      【解决方案4】:

      如果我说的是显而易见的,请原谅我,但我在阅读您的问题后得到了这种印象。

      您知道 .NET 中每种类型的基本类型都是对象吗? 因此,您描述的对象类型的数据行中的列也可以与您尝试分配的成员具有相同的类型,然后需要进行简单的转换。

      例如

      eventObject.EventId = (int)row["event_id"];

      【讨论】:

        【解决方案5】:

        总结一下——只要定义这些方法,你就可以在需要String作为参数的方法中使用Test类的对象。

        class Test
        {
            private String txt;
        
            public static implicit operator string(Test t)
            {
                return t.ToString();
            }
        
            public override string ToString() 
            {
                return txt;
            }
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-01-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-04-04
          • 2012-07-29
          相关资源
          最近更新 更多