如何将长参数列表传递给方法或任何其他最佳方法来实现此目的

时间:2011-07-21 08:18:01

标签: c# .net visual-studio-2010 refactoring

我将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

修改 上面的代码是我真实代码中的一个例子,但我更有兴趣知道什么是实现这一目标的最佳方法。

来自编码恐怖片(Jeff Atwood)

  

方法具有的参数越多,它就越复杂。限制   给定方法中所需的参数数量,或使用对象   结合参数。

以上引用来自此博文。 Code Smells

感谢。

4 个答案:

答案 0 :(得分:6)

传递代表数据的对象:

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 - 或者可能不那么频繁

答案 1 :(得分:3)

为什么不构造一个对象(所有公共属性)来表示你的数据并在其c-tor中赋值,然后将它传递给你的方法?

使用数据表的原因是什么?

答案 2 :(得分:1)

您可以创建一个类,将参数添加为属性,然后将此类的实例传递给您的方法

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

AssignValuesToDataTable(Project p)

答案 3 :(得分:0)

如何将您的方法更改为:

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

您可以在前面创建新的DataRow,并直接从源中为其指定值。然后将新DataRow传递给要插入的方法。显然,在添加之前,您可能希望在方法中进行一些检查,以确保新Row符合所有约束和条件。