代码之家  ›  专栏  ›  技术社区  ›  Mark Carpenter

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

  •  2
  • Mark Carpenter  · 技术社区  · 14 年前

    我目前正在处理一些重复的代码-更具体地说,处理从 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<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();
    }
    

    问题是:

    有人向我指出,以这种方式使用扩展方法是危险的,我应该使用简单的静态函数 数据行 而是处理数据(本质上是一个没有 this 参数)。

    问题是:

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

    3 回复  |  直到 14 年前
        1
  •  1
  •   CodingGorilla    14 年前

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

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

        2
  •  2
  •   Sorax    14 年前

    Extension methods 不比制造一个 static 方法,因为 extension methods 编译为静态方法。它们只是对程序员有利的语法糖。你可以比较一下 IL 但这篇文章有一个例子可以帮助你说服你的同事 扩展方法 并不危险: How do Extension Methods work?

        3
  •  1
  •   Brad    14 年前

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

    更新: 好吧,我明白你的意思了,@Pwninstein: DataRow 你给分机打电话很可能是任何事情。 但是,有一个方法需要 数据行 作为使你的对象 再危险不过了 .