2013-02-07 29 views
0

我有一个库类,我要添加两种方法:C#类设计有多个参数

public IEnumerable<OpenCall> OpenCalls() 
{ 
    return something; 
} 

public IEnumerable<OpenCall> OpenCalls(DateTime start, DateTime endd) 
{ 
    return something_slightly_different; 
} 

里面每一个方法,我要调用另一个方法(AverageResolutions()),返回列表平均分辨率。显然这种方法也需要取0个参数或2个参数。我正在做的事情,我要么以两个几乎相同的OpenCalls()副本结束,要么两个几乎完全相同的AverageResolutions()副本稍微改变以允许DateTime参数。

我想我这样做是错误的 - 我怎么才能结束一个方法的版本,要么将采取0或2参数,然后决定什么,以进一步调用下行,如果他们是null或不空值?

+0

OpenCalls发生了什么?调用一个数据库?只是一个列表上的操作? –

+0

我没有看到任何问题。你可以让OpenCalls()调用OpenCalls(DateTime.MinValue,DateTime.MaxValue)。 –

+0

OpenCalls()调用一个名为AverageResolutions()的方法,该方法通过DB调用返回一个类型为AverageResolution的泛型列表。 OpenCalls()然后使其自己的数据库调用来填充另一个列表,并且作为该填充的一部分,它会根据从DB返回的内容搜索AverageResolutions()列表。 – markp3rry

回答

1

你可以改变方法签名使用可选参数:

public IEnumerable<OpenCall> OpenCalls(DateTime? start=null, DateTime? end=null) 
{ 
    if (start.HasValue && end.HasValue) 
    { 
     return something_slightly_different; 
    } 
    return something; 
} 

请注意,您将需要作出DateTimeα参数为空的,因为否则你不能将能够设置默认值(有编译时常量)。

有关可空类型的更多信息,以及语法糖(写入DateTime?而不是Nullable<DateTime>看到MSDN article on Nullable Types

更多有关可选参数见MSDN article about Named and Optional Arguments的可选参数部分。

+0

'?'是什么?在第一个DateTime参数数据类型之后呢? – markp3rry

+0

它将'DateTime'参数表示为可空类型。有关进一步说明,请参见[MSDN可空类型](http://msdn.microsoft.com/en-us/library/1t3y8s4s(v = vs80).aspx)。 – Spontifixus

0
public IEnumerable<OpenCall> OpenCalls() 
{ 
    return OpenCalls(null, null); 
} 

public IEnumerable<OpenCall> OpenCalls(DateTime? start, DateTime? endd) 
{ 
    //if (!start.HasValue) ... etc. 
    return something_slightly_different; 
} 

如果这个解决方案是“聪明的”,真的取决于你的其他代码。有几十个空检查不是很好。如果你只需要检查一次或两次,这可能是一个很好的解决方案。 此外,你可以使用可选参数。

+0

日期时间参数需要为空(DateTime?)才能正常工作,除此之外,这就是我的工作方式+1 – RobJohnson

+0

任何有SOP答案的代码片段都会以快速VS项目开始,该项目会检查是否代码编译。避免采取捷径。 –

+0

这是一个可行的设计解决方案,将这些链接在一起?我的意思是在我的代码中,我从公共存储库方法转到私有存储库方法,然后转到私有静态方法来获取数据库查询字符串。其中每个参数都会有可以为空的开始和结束日期时间参数,并且每个参数都会执行HasValue检查以查看是否都填充(或不填充)。 – markp3rry