Автоматическое преобразование типов в C # - PullRequest
14 голосов
/ 22 января 2011

Я знаю, что вы можете переопределить метод ToString () объекта, чтобы каждый раз, когда вы вызываете объект или передаете его функции, для которой требуется тип 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'.Итак, я мог бы назвать это так:

eventObject.Cost = row["cost"];
eventObject.EventId = row["event_id"];

Строка - это DataRow, если это имеет значение.

Ответы [ 5 ]

31 голосов
/ 22 января 2011

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;
    }
}
2 голосов
/ 22 января 2011

Я знаю, что вы можете переопределить метод 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) и будет пытаться преобразовать переданный вами аргумент (тип которого *)1010 *) к нему.Я думаю, вы, вероятно, введены в заблуждение чем-то вроде 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());
}
0 голосов
/ 14 октября 2014

Подводя итог - просто определите эти методы, и вы можете использовать объекты класса Test в методах, требующих в качестве параметра String.

class Test
{
    private String txt;

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

    public override string ToString() 
    {
        return txt;
    }
}
0 голосов
/ 23 января 2011

Простите, если я констатирую очевидное, но у меня сложилось такое впечатление после прочтения вашего вопроса.

Вы знаете, что базовый тип каждого типа в .NET является объектом, верно?Таким образом, столбец в datarow, который вы описываете для объекта типа, также может быть того же типа, что и член, которому вы пытаетесь присвоить, и тогда требуется простое приведение.

, например

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

0 голосов
/ 22 января 2011

Я считаю, что вы ищете неявное преобразование, которое описано здесь: http://msdn.microsoft.com/en-us/library/z5z9kes2.aspx.

Однако, добавление их в объект было бы очень плохой идеей по причинам, изложенным на странице Ive связан с.

...