Как передать длинный список параметров в метод или любой другой лучший способ добиться этого - PullRequest
2 голосов
/ 21 июля 2011

Я передаю более 20 аргументов разных типов в метод. Там должен быть какой-то чистый способ пройти это. Можете ли вы помочь мне.

Я могу передать массив объектов, имеющих все эти 20+ аргументов, но в целевом методе я должен проверить тип. Это хороший способ передать длинный список аргументов.

Код: образец из кода не заполнен

private DataTable CreateDataTable(string[] args)
{
    DataTable dt = new DataTable();
    dt.Clear();

    foreach (var arg in args)
    {
    dt.Columns.Add(arg);
    }

    return dt;
}

Я могу передать массив в этом методе, потому что все аргументы одного типа.

DataTable dt = CreateDataTable(new string[] { "ProjectId", 
                        "ParentProjectId", 
                        "ProjectName", 
                        "CreationDate");

Теперь у меня есть более 20+ значений типов diff, таких как следующие

int projectId = 100;
int? parentProjectId = SomeCondition ? 10 : null;
string projectName = "Good Project"
DateTime createdDate = DateTime.Now;
.
.
.

В этом методе я бы присвоил значения столбцам.

AssignValuesToDataTable(dt, Arguments list ......)
// Implementation would be like this. Here I am passing 20+ arguments.
private DataTable AssignValuesToDataTable(DataTable dt, arguments list ........)
{
    DataRow row = dt.NewRow();
    row["ProjectId"] = projectId;
    .
    .
    .

    dt.Rows.Add(row);
}

Не могли бы вы помочь. Я использую C#4

EDIT: Приведенный выше код является примером из моего реального кода, но мне интереснее узнать, что является лучшим способом для достижения этой цели.

Из Ужаса Кодирования (Джефф Этвуд)

Чем больше параметров у метода, тем он сложнее. Ограничить количество параметров, которые вам нужны в данном методе, или использовать объект для объединить параметры.

Выше цитата из этого поста. Кодовые запахи

Спасибо.

Ответы [ 4 ]

6 голосов
/ 21 июля 2011

Вместо этого передайте объект, который представляет данные:

private DataTable AssignValuesToDataTable(DateTable dt, Project project)
{
     row["ProjectId"] = project.Id;
     row["ProjectName"] = project.Name;
     ...
}

с

public class Project
{
    public int Id {get;set;}
    public string Name {get;set;}
    ...
}

конечно, тогда возникает вопрос: зачем вообще использовать DataTable ? поскольку класс Project является гораздо лучшей метафорой / механизмом для выражения этих данных, а List<Project> (или BindingList<Project>) идеально подходит для сбора таких данных.

(подсказка: я очень, очень, очень редко использую DataTable - или, может быть, реже)

3 голосов
/ 21 июля 2011

Почему бы не создать объект (все общедоступные свойства) для представления ваших данных и присвоения значений в его c-tor, а затем передать его в ваш метод?

Есть ли причина использования данных?

1 голос
/ 21 июля 2011

Вы можете создать класс, добавить параметры в качестве свойств и затем передать экземпляр этого класса в ваш метод

class Project
{
    public int projectId {get; set;}
    public int parentProjectId {get; set;}
    public string projectName {get; set;}
}

AssignValuesToDataTable (Project p)

0 голосов
/ 21 июля 2011

Как насчет изменения вашего метода на:

private DataTable AssignValuesToDataTable(DataTable dt, DataRow row)
{
 dt.Rows.Add(row);
}

Вы создаете новый DataRow вперед и присваиваете ему значения непосредственно из источника. Затем передайте новый DataRow вашему методу для вставки. Очевидно, вы можете захотеть сделать некоторые проверки в вашем методе, чтобы убедиться, что новая строка соответствует всем ограничениям и условиям, прежде чем добавлять ее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...