C# 如何正确测试泛型定义的函数的参数是否为null
我有一个类,它接受这样的泛型:C# 如何正确测试泛型定义的函数的参数是否为null,c#,generics,C#,Generics,我有一个类,它接受这样的泛型: public class Foo<T> { public IActionResult MyClass(T id) { if (id == null) //do stuff else //do something else } } 公共类Foo{ 公共IActionResult MyClass(T id){ if(id==null) //做事 其他的 //做点别的 } } 我注意到,如果缺少参数,.NETCo
public class Foo<T> {
public IActionResult MyClass(T id) {
if (id == null)
//do stuff
else
//do something else
}
}
公共类Foo{
公共IActionResult MyClass(T id){
if(id==null)
//做事
其他的
//做点别的
}
}
我注意到,如果缺少参数,.NETCore MVC会自动填充该参数。因此,如果有人用newfoo
实例化我的类,我的参数id
将永远不会等于null,而是等于Guid.Empty
我想到了两种解决方案,但我不知道如何实现其中一种
T
必须是可为空的类型,如Guid?
,以便我可以使用if(id.HasValue)
检查是否提供了id参数。这可能吗if(id==null | | id==default(TId));
实现这一点的最佳方法是什么?我最终使用的是:
if (id == null || Object.Equals(id, default(TId)))
//id was not supplied
else
//id was supplied
如果不将
t
限制为引用或值类型,则可以检查它是否为null
或等于t
的默认值:
if (id != null && !id.Equals(default(T))
Object.Equals(id,null)
将编译。如果(id!=null&&!id.Equals)(默认值(T))为Guid?id=null;
,则返回true
?谢谢你mm8,我刚刚发现了同样的问题。如果你将同样的问题作为答案发布,我会选择正确的答案。请注意,这可能会导致有趣的惊喜。default(int)例如,
是0
,但是0
当然是一个可以显式提供的整数值。我对MVC没有太多经验,但是如果可能的话,您的参数应该可以显式为空。谢谢。您的信息非常有效!幸运的是,对于我们的用例来说,这不会造成问题,但确实是你提出的合理担忧!