我将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
感谢。
答案 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符合所有约束和条件。