Я пишу тесты для проверки операции отображения, которая принимает толстый тяжелый объект данных, полный SqlDataTypes, и преобразует их в pocos, используя простые типы значений CLR.
Это метод, который я построил до сих пор:
private static void CompareValues(string k, Dictionary<string, string> propertyMap, TData sourceDal, TEntity entity)
{
string sourceField = k;
string destField = propertyMap[k];
object sourceval = sourceDal.GetType().GetProperty(sourceField).GetValue(sourceDal, null);
object destval = entity.GetType().GetProperty(destField).GetValue(entity, null);
Assert.AreEqual(sourceval,
destval,
String.Format("Values not equal on fields {0} ({1}) to {2} ({3})",
sourceDal.GetType().GetProperty(sourceField).Name, sourceDal.GetType().GetProperty(sourceField).PropertyType,
entity.GetType().GetProperty(destField).Name, entity.GetType().GetProperty(destField).PropertyType)
);
}
К сожалению, при сравнении SqlInt32 с int? Этот метод не проходит проверку. «Значение» sourceval отображается как {74}
(сложный тип с обычными дополнительными свойствами SqlDataType), тогда как значение destval отображается как 74
.
Я не хочу, чтобы этот метод был осведомлен о типах - я не хочу, чтобы он предполагал, что одна сторона является типом sql, а другая - нет, потому что мои тесты отображения будут передавать данные в обоих направлениях.
Я пытался расширить CompareTo на SqlInt32
public static int CompareTo(this SqlInt32 sqlInt32, int? value)
public static int CompareTo(this SqlInt32 sqlInt32, int value)
но методы расширения не вызываются (хотя intelisense правильно определяет их в моем тестовом проекте)
Я лаю не на том дереве? Как настроить общее сравнение между типами значений SqlDataTypes и CLR, которое дает точные результаты?