C#中的自动类型转换

时间:2011-01-22 17:31:59

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

我知道您可以覆盖对象的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。

5 个答案:

答案 0 :(得分:31)

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

答案 1 :(得分: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());
}

答案 2 :(得分:0)

我相信你要找的是隐式转换,这里描述了http://msdn.microsoft.com/en-us/library/z5z9kes2.aspx

然而,由于我链接到的页面上列出的原因,将这些添加到对象将是一个非常糟糕的主意。

答案 3 :(得分:0)

请原谅我,如果我说明显而已,但在阅读完你的问题后我得到了这个印象。

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

例如

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

答案 4 :(得分:0)

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

class Test
{
    private String txt;

    public static implicit operator string(Test t)
    {
        return t.ToString();
    }

    public override string ToString() 
    {
        return txt;
    }
}