2015-07-07 16 views
5

Мы создали Id32 и Id64 struct для обертывания целых чисел и длинных значений, поступающих из БД, поэтому они могут быть явно обработаны как идентификаторы с помощью Json-конвертера (с выделенными настраиваемыми преобразователями).Runtime неявного литья из объекта

Проблема заключается в том, что мы читаем данные из Dictionary<string, object>, что на самом деле является DataRow -кака объекта, где string часть является именем столбца и object части значения.

Так до того мы имели этот код для чтения значения:

int myVal = (int)row["COLUMN"] 

Мы хотим, чтобы этот код продолжать работать и после этих изменений.

Но так как row["COLUMN"] - это object (@ compile-time), то неявный листинг терпит неудачу, хотя на самом деле это Id32 (@ run-time).

Следующая, очевидно, работает:

int myVal = (Id32)row["COLUMN"] 

Но есть некоторые пути, чтобы исправить это без изменения код, который считывает значение?

Это код структуры:

public struct Id32 
{ 
    public readonly int Value; 

    public Id32(int id) { this.Value = id; } 

    public static implicit operator int(Id32 id) { return id.Value; } 

    public static implicit operator Id32(int id) { return new Id32(id); } 
} 
+0

См. Также: http://stackoverflow.com/questions/1611083/will-the-c-sharp-compiler-perform-multiple-implicit-conversions-to-get-from-one –

+0

Этот вопрос касается неявных преобразований , не бросает. Хотя задействован кастинг (у вас есть «объект», и его нужно отличить от 'int', возможно, внутри неявного преобразования из' объекта', определенного в 'Id32'). – binki

ответ

2

На моем взгляде, не очень достойное решение, но он работает (надеюсь, есть более эффективные решений): если вы используете dynamic основной тип определяется на время выполнения , поэтому проверка типа с неявным отрисовкой будет работать.

Код я использовал:

dynamic o = new Id32(1); 
// dynamic o = row["COLUMN"]; in your case 

int myVal = (int)o; 

Если изменить dynamic к object вы будете иметь текущую ситуацию, которая терпит неудачу.

+1

Это действительно интересно. Но я не знаю, можно ли объявить словаря '... Я попробую. – Teejay

+0

Нет, но он уже преобразован в это время (если вы делаете это до добавления в словарь), значит, это не имеет значения. –

+0

К сожалению, таким образом, мы должны изменить код, чтобы все равно прочитать значение. – Teejay

3

Я думаю, что это невозможно с ограничением не изменять код получения int myVal = (int)row["COLUMN"].

Вам нужно будет добавить неявный листинг в object (до int), который не может быть выполнен. Есть много способов сделать ваш собственный простой, но все, о чем я могу думать, или вы найдете как here, требуется изменить эту строку.

Даже если вы его не меняете, я думаю, вам придется перекомпилировать его, поэтому, если вы перекомпилируете его, почему бы не изменить его? Есть некоторые инструменты рефакторинга, которые должны сделать даже тысячи таких строк довольно легко.

+0

Спасибо за ваш вклад. – Teejay

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

  • Нет связанных вопросов^_^