C# 我是否应该使用扩展方法来帮助从DataRow/表创建模型对象?

C# 我是否应该使用扩展方法来帮助从DataRow/表创建模型对象?,c#,.net,extension-methods,C#,.net,Extension Methods,我目前正在使用一些重复的代码—更具体地说,是处理从DataRows和DataTables创建模型对象的代码。我认为创建扩展方法来减少重复代码,并添加一些语法糖分是安全的 我以前拥有的(简化): public List<MyObject> GetThings(){ DataSet dataSet = SomeDatabaseCall(); var objects = new List<MyObject>(); foreach(DataRow row

我目前正在使用一些重复的代码—更具体地说,是处理从
DataRow
s和
DataTable
s创建模型对象的代码。我认为创建扩展方法来减少重复代码,并添加一些语法糖分是安全的

我以前拥有的(简化):

public List<MyObject> GetThings(){
    DataSet dataSet = SomeDatabaseCall();

    var objects = new List<MyObject>();
    foreach(DataRow row in dataSet.Tables[0].Rows){
        //Process Row, create object, add to objects
    }
    return objects;
}
public MyObject GetThing(int id){
    DataSet dataSet = SomeDatabaseCall(id);
    DataRow row = dataSet.Tables[0].Rows[0];
    //Process Row, create object, return it
}
public List GetThings(){
DataSet DataSet=SomeDatabaseCall();
var objects=新列表();
foreach(数据集中的DataRow行。表[0]。行){
//处理行、创建对象、添加到对象
}
归还物品;
}
公共MyObject获取(内部id){
DataSet DataSet=SomeDatabaseCall(id);
DataRow row=dataSet.Tables[0]。行[0];
//处理行,创建对象,返回它
}
之后我想要什么:

public List<MyObject> GetThings(){
    DataSet dataSet = SomeDatabaseCall();
    return dataSet.ToMyObjects(); //Internally calls the ToMyObject for each row
}
public MyObject GetThing(int id){
    DataSet dataSet = SomeDatabaseCall(id);
    DataRow row = dataSet.Tables[0].Rows[0];
    return row.ToMyObject();
}
public List GetThings(){
DataSet DataSet=SomeDatabaseCall();
return dataSet.ToMyObjects();//为每一行内部调用ToMyObjects
}
公共MyObject获取(内部id){
DataSet DataSet=SomeDatabaseCall(id);
DataRow row=dataSet.Tables[0]。行[0];
返回row.ToMyObject();
}
问题:

public List<MyObject> GetThings(){
    DataSet dataSet = SomeDatabaseCall();
    return dataSet.ToMyObjects(); //Internally calls the ToMyObject for each row
}
public MyObject GetThing(int id){
    DataSet dataSet = SomeDatabaseCall(id);
    DataRow row = dataSet.Tables[0].Rows[0];
    return row.ToMyObject();
}
有人向我指出,以这种方式使用扩展方法是危险的,我应该使用简单的静态函数,使用
DataRow
来处理数据(本质上是一种没有
this
参数的扩展方法)

问题:

public List<MyObject> GetThings(){
    DataSet dataSet = SomeDatabaseCall();
    return dataSet.ToMyObjects(); //Internally calls the ToMyObject for each row
}
public MyObject GetThing(int id){
    DataSet dataSet = SomeDatabaseCall(id);
    DataRow row = dataSet.Tables[0].Rows[0];
    return row.ToMyObject();
}

在这种情况下,扩展方法有意义吗?为什么这样做会被认为是危险的呢?

我认为这样做没有什么危险;只要你能控制所有的代码和数据集的布局,你的数据集就不会被改变。这似乎与扩展方法的设计目的完全相同


我很想听听这是一种“危险”用法的说法背后的原因。

如果您将扩展方法放在一个特定于您的项目的库中,那么您就不会冒着用非常特定的扩展玷污其他项目的风险。我也不知道这有多危险


更新:好吧,我明白你的意思了,@Pwninstein:但是,使用一个将
数据行
作为参数的方法来创建对象并不危险。
扩展方法
与创建
静态
方法一样危险,因为
扩展方法
编译为静态方法。它们只是对程序员有利的语法糖。你可以自己比较
IL
,但这里有一篇文章和一个例子,可以帮助你说服你的同事
扩展方法
并不危险:

说它们危险的人说什么是危险的?本质上,如果
DataRow
类有x个转换扩展方法,那么当调用它们时,其中有(x-1个)会(很可能)失败,因为该行包含特定类型的对象。简言之,扩展方法导致错误的风险急剧上升。我的论点是,任何一个都有内在的风险,因为DataRow可以包含任何内容。我同意你的论点。这也是orm如此有用的原因之一。