В качестве альтернативного решения я использовал приватную функцию, которая принимала динамический аргумент.
Затем добавлены две открытые функции, которые принимают аргументы «DataRow» и «DataReader».
Вы можете использовать это, чтобы ограничить вызовы известными типами или интерфейсами.
public MyResults DoStuff(DataRow dr)
{
return ActualDoStuff(dr);
}
public MyResults DoStuff(DataReader dr) //IDataRecord is better if just reading
{
return ActualDoStuff(dr);
}
private MyResults ActualDoStuff(dynamic dr)
{
var rez = new MyResults();
rez.someValue = dr["someValue"];
return rez;
}
Слово предупреждения, хотя. Возможно, вам придется немного переписать код загрузки, поскольку поведение содержимого dr, доступного через строку, в динамике немного отличается. То есть
if(dr["someValue"] == DBNull.Value)
может потребоваться изменить на
if(dr["someValue"] is DBNull)
Но этот подход по-прежнему позволяет избежать дублирования проблемы с кодом загрузки.