[英]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.