C#中的自动类型转换

Posted

技术标签:

【中文标题】C#中的自动类型转换【英文标题】:Automatic type Conversion in 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 更可取。 现在会用,觉得没啥区别 【参考方案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;
    

【讨论】:

以上是关于C#中的自动类型转换的主要内容,如果未能解决你的问题,请参考以下文章

2.6 C#的数据转换

C#中的类型转换

理解C#语言中的类型转换----初学者的理解,请大神指教

C#中的类型转换

C#中的类型转换-自定义隐式转换和显式转换

C#中的强制类型转换与as转换的区别