2010-05-11 4 views
3

Итак, я написал короткий код для быстрого преобразования между бизнес-объектами и моделями просмотра. Не суетиться в моем собственном блоге, но you can find the details here, если вам интересно или нужно знать.Неявные преобразования типов в отражении

Одна проблема, с которой я столкнулся, это то, что у меня есть собственный тип коллекции ProductCollection, и мне нужно включить это в строку [] в моей модели. Очевидно, так как не существует неявного приведения по умолчанию, я получаю исключение в своем конверторе контрактов.

Итак, я думал, что написать следующий немного кода, и это должно решить проблему:

public static implicit operator string[](ProductCollection collection) { 
    var list = new List<string>(); 
    foreach (var product in collection) 
    { 
     if (product.Id == null) 
     { 
      list.Add(null); 
     } 
     else 
     { 
      list.Add(product.Id.ToString()); 
     } 
    } 
    return list.ToArray(); 
} 

Однако, он все еще терпит неудачу с тем же исключением литых. Мне интересно, если это имеет какое-то отношение к размышлению? Если да, есть ли что-нибудь, что я могу здесь сделать? Я также открыт для архитектурных решений!

+0

Какую внутреннюю ценность вы надеетесь получить от добавления нулевых строк в список, который вы генерируете? Просто интересуюсь. –

+0

Вы сказали 'cast exception', но объявили оператор' implicit'. Вы имели в виду объявление оператора «Явный»? Отправьте код, в котором вы ожидаете, что это произойдет. –

+0

Nathan Taylor, если product.Id был null, ToString() на нем закончит юниверс. –

ответ

3

Во-первых, оператор implicit допускает использование implcit конверсий (без директивы о литье). explicit Операторы работают на приведениях.

Тем не менее, это не настоящая проблема. Операторы не являются полиморфными (они перегружены, а не переопределены); то есть для того, чтобы воспользоваться перегруженным оператором, вы должны ссылаться на класс в контексте класса, который его определяет.

Например:

public class Foo 
{ 
    public static implicit operator Bar(Foo foo) { return new Bar(); } 
} 

public class Bar { } 

... 

void Baz() 
{ 
    Foo foo = new Foo(); 

    Bar bar = foo; // OK 

    object baz = foo; 

    bar = baz; // won't compile, there's no defined operator at the object level 

    bar = (Bar)baz; // will compile, but will fail at runtime for the same reason 
} 

Не зная, что вы делаете и как вы делаете это, я не могу предложить много на пути содержательной альтернативы. Некоторые идеи, однако:

  1. Override ToString (или использовать общий базовый класс/интерфейс для ваших сущностей с вашей собственной версией, если вы не хотите использовать ToString) на ваши сущностях, а затем перечислить коллекции в общем смысле для построения ваша строка массива
  2. Обеспечить ToStringArray функцию ваших коллекций (путем общего базового класса или интерфейса), что делает что-то подобное

Самая большая точка не использовать операторы для этой цели; они вам не помогут.

+0

Это очень хорошее объяснение. Благодаря! Это неясный бит языка, о котором я не знал, пока не найду решение для этого. –

Смежные вопросы