C# 正在检查对象参数是否包含datetime

C# 正在检查对象参数是否包含datetime,c#,.net,C#,.net,我有一个带有object参数的方法,因此不同的调用方法可以使用不同的方法。在方法内部,我需要检查对象的第一个参数是否为date,如果没有设置今天的日期 public void CreateNew(FileModel data, Object otherParams = null) { DateTime portDate = DateTime.Now; if (otherParams is DateTime) portDate = (DateTime)othe

我有一个带有object参数的方法,因此不同的调用方法可以使用不同的方法。在方法内部,我需要检查对象的第一个参数是否为date,如果没有设置今天的日期

public void CreateNew(FileModel data, Object otherParams = null)
{
     DateTime portDate = DateTime.Now;
     if (otherParams is DateTime)
         portDate = (DateTime)otherParams;

    //In case 1 portDate is portDate value and in case 2 portDate value id 
    //DateTime.Now() even though portDate contains a value.
}
我以如下两种方式向该方法传递一个对象

CreateNew(fileData,new {portDate=portDate});
CreateNew(fileData,new {portDate=portDate,countries=countries});

上述代码适用于第一种情况,但第二种情况失败,并且portDate始终是今天的日期。那么,我怎样才能有一个通用的日期检查案例来正确处理这两个案例呢?

您可以使用
动态
而不是
对象
,然后进行检查

if (otherParams?.portDate is DateTime)
{ ...}

尽管我同意你的评论,你似乎以错误的方式使用匿名类。如果您知道接收到的内容,只需创建一个真正的类,该类将具有
DateTime-portDate
,以便您可以确定。

您可以查看对象的所有属性,并检查其中一个是否为DateTime

    object example  = new {si= DateTime.Now, no= "no"}; //object example

    var typevar  = example.GetType().GetProperties(); //get all te props
    //lets loop all the props
    foreach(var i in typevar){
       if(i.PropertyType == typeof(System.DateTime)){
         //if is DateTime well write the name of prop with i.Name 
         Console.WriteLine("The propiertie {0} is date time", i.Name);
       }
    }

它也适用于动态参数

您的问题表明,如果
其他参数
不是
日期时间
,您将使用
日期时间。现在
。这表明,如果
otherParams
不是
DateTime
,则不使用它

如果是这样,那么更好的签名可能是:

public void CreateNew(FileModel data, DateTime? portDate = null)
这向调用者表明,
portDate
应该是
DateTime
,但它是可选的。然后你可以这样做:

portDate = portDate ?? DateTime.Now;
因此,如果它没有值,它将被替换为
DateTime.Now

如果有不同的方法调用它,您可以根据调用方式提供不同的重载

您还可以添加:

public void CreateNew(FileModel data, Countries countries, DateTime? portDate = null)
如果其中一个可能为null,但它们不应该都为null,那么您可以创建反映这一点的签名,然后让每个签名调用处理null的
private
方法。这样,您可以更清楚地传达期望

如果其他东西需要调用类似的方法,但第二个参数可能完全不同(不是日期),那么最好创建一个不同的方法。如果参数的类型是
object
,一种可能性是它可能是
DateTime
,并且至少还有一种其他正确的类型,那么调用者就无法知道应该传递什么。例如,他们可以调用:

CreateNew(someFileModel, new List<string>());
CreateNew(someFileModel,newlist());
…它将编译,但您的方法对该
列表没有任何用处,甚至可能引发异常。类型安全性是非常有价值的,因为它允许我们预先获得所有正确的信息。如果我们没有传递正确的类型,代码甚至无法编译。如果可以避免的话,我们不希望我们的代码被编译,然后给我们一个运行时错误


作为一个广泛的指导原则,我们应该只使用
object
,如果类型真的不重要的话。您可以将对象传递给
String.Format
,因为在大多数情况下,它只需要调用
ToString()
,所以类型无关紧要。90%或更多的时候(我认为接近99.5%)这种类型确实很重要。如果我们陷入困境,觉得需要使用
dynamic
object
,那么我们应该后退一步,试着从那个角落把自己画出来。

我觉得你在滥用C的匿名类型。为什么不改为使用强类型元组参数呢?我的建议是,不要编写与不同调用方法不同的方法。如果
otherParams
可以是不同的东西,那么人们怎么知道它可能是什么呢?如果您发布了一些不同变体的示例,那么可能会有一些关于哪些部分可以重用和组合以及哪些部分应该完全分开的建议。因为组合以减少重复是好的,只是不会让意图变得不清楚。@Dai我的理解可能完全错误,但是当我不总是确定参数的数量时,我可以使用tuple吗?因为在案例1中,有1个,在案例2中,有2个,我可能有一个案例,其中有3个。你不能使用元组,但是为什么不创建一个普通的类呢?它应该被形式化为不同的方法签名。