Автоматическое преобразование типов в C#
Я знаю, что вы можете переопределить метод toString() объекта, так что каждый раз, когда вы вызываете объект или передаете его функции, которая требует строкового типа, он будет преобразован в строку.
Я написал несколько методов расширения для типа объекта "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". Итак, я мог бы назвать это так:
eventObject.Cost = row["cost"];
eventObject.EventId = row["event_id"];
строка является DataRow, если это имеет значение.
5 ответов
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 () объекта, так что каждый раз, когда вы вызываете объект или передаете это к функции, которая требует Тип строка будет преобразована в Строка.
нет, вы не правы. Следующий код не будет компилироваться:
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.
однако добавление их в объект было бы очень плохой идеей по причинам, изложенным на странице, с которой я связан.
простите, если я констатирую очевидное, но у меня сложилось такое впечатление после прочтения вашего вопроса.
вы знаете, что базовый тип каждого типа в .NET является объектом правильно? Таким образом, столбец в datarow, который вы описываете типа object, также может быть того же типа, что и элемент, которому вы пытаетесь назначить, а затем требуется простое приведение.
например
времени eventobject.EventId = (int)строка["event_id"];
чтобы подвести итог-просто определите эти методы, и вы можете использовать объекты класса Test в методах, требующих String в качестве параметра.
class Test
{
private String txt;
public static implicit operator string(Test t)
{
return t.ToString();
}
public override string ToString()
{
return txt;
}
}