繁体   English   中英

C#中的自动类型转换

[英]Automatic type Conversion in C#

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

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

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

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

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

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

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

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

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

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

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

class Test
{
    private String txt;

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

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

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

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

例如

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM