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#中的自动类型转换的主要内容,如果未能解决你的问题,请参考以下文章