Здравствуйте, Linguru, Вы писали:
L>Не верю. Это противоречит философии библиотеки
Я явно указываю, что на что мапить. Почему кто-то за меня решил, что это "не то"?
эмн... вот что интересно...
обджект маппер не найдя среди мембер мапперов "Col1" попробует определить его через GetComplexMapper(...)... последний ни мало сумнявшись найдет маппер на поле "Col1" у которого алиас "col2"... так вот, если убрать эксепшн вылетит новый — при попытке добавить этот маппер к списку — мол ключ уже добавлен... можно, конечно, сделать так:
mm = GetComplexMapper(name, name);
if (mm != null)
{
if (_nameToMember.ContainsKey(mm.Name))
return mm;
if (_members.Contains(mm))
throw new MappingException(string.Format(
"Wrong mapping field name: '{0}', type: '{1}'. Use field name '{2}' instead.",
name, _typeAccessor.OriginalType.Name, mm.Name));
Add(mm);
}
но желаемого эффекта мы не молучим, вот такой тест — провалится:
[Test]
public void NameTest2()
{
DataTable dt = new DataTable();
dt.Columns.Add("col2", typeof(int));
dt.Columns.Add("col1", typeof(int));
dt.Rows.Add(2, 1);
Object4 o = Map.DataRowToObject<Object4>(dt.Rows[0]);
Assert.AreEqual(2, o.Col1);
}
от оригинального я тут поменял порядок колонок, и сначала в поле "Col1" смапилось значение из столбца "col2" а потом из столбца "col1"
чтобы этого избежать, надо возвращать null, скажем так:
mm = GetComplexMapper(name, name);
if (mm != null)
{
if (_nameToMember.ContainsKey(mm.Name))
return null;
if (_members.Contains(mm))
throw new MappingException(string.Format(
"Wrong mapping field name: '{0}', type: '{1}'. Use field name '{2}' instead.",
name, _typeAccessor.OriginalType.Name, mm.Name));
Add(mm);
}
или вообще вместо эксепшена... но наскока это черевато — я