Должен ли я использовать методы расширения, чтобы помочь в создании объектов модели из DataRow / Table? - PullRequest
2 голосов
/ 19 ноября 2010

В настоящее время я работаю с некоторым кодом, который повторяется - более конкретно, с кодом, который имеет дело с созданием объектов моделей из 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();
}

Проблема:

Мне было указано, что использование методов расширения в этомпуть опасен, и я должен использовать простые статические функции, которые вместо обработки * обрабатывают данные DataRow (по существу, это метод расширения без параметра this).

Вопрос:

Могут ли методы расширения иметь смысл в этом сценарии?И почему такой способ действий считается опасным?

Ответы [ 3 ]

2 голосов
/ 19 ноября 2010

Extension methods не более или менее опасны, чем создание метода static, поскольку extension methods компилируется в статические методы.Они просто синтаксический сахар для пользы программистов.Вы можете сравнить IL самостоятельно, но вот статья с примером, который может помочь вам убедить коллегу extension methods не опасны: Как работают методы расширения?

1 голос
/ 19 ноября 2010

Если вы поместите методы расширения в библиотеку, специфичную для вашего проекта, то вы не рискуете запутать другие проекты своими очень специфическими расширениями.Я не понимаю, насколько это опасно.

ОБНОВЛЕНИЕ: Хорошо, я понимаю вашу точку зрения, @Pwninstein: DataRow, на котором вы называете расширение, вполне может НИЧЕГО. Однако наличие метода, который принимает DataRow в качестве аргумента для создания вашего объекта, не более опасен .

1 голос
/ 19 ноября 2010

Я не вижу в этом ничего опасного;до тех пор, пока у вас есть контроль над всем кодом и компоновка вашего DataSet не изменится из-под вас.Это похоже на то, для чего были разработаны методы расширения.

Мне было бы интересно услышать обоснование утверждения, что это было «опасное» использование.

...