Лично я буду советовать против этого;нуль не совсем то же самое, что NaN.Если вы действительно хотите это сделать, вам нужно взглянуть на GetTypeDeserializer
.Код для этого генерируется динамически с использованием ILGenerator
и является довольно сложным.Если вы ищете строку:
il.MarkLabel(isDbNullLabel); // incoming stack: [target][target][value]
, то это то место, куда код переходит, если обнаружен DbNull
.В настоящее время он просто извлекает два значения (значение и цель) из стека, бросает их на пол и продолжает.Вам нужно будет проверить float
/ double
в качестве особого случая, применить свое преобразование, а затем назначить NaN члену.
Я повторяю свое утверждение, однако, что это простодействительная вещь, чтобы сделать.Гораздо более простым вариантом будет:
public double? Value {get;set;}
, который требует нулевых изменений и будет работать в настоящее время.Если вы действительно хотите, чтобы он обрабатывался как необнуляемый тип double, возможно:
private double foo = double.NaN;
public double Foo { get { return foo; } set { foo = value; } }
теперь по умолчанию он будет NaN
и будет корректно реализовываться при наличии значений.