C# 当它';s值为空?
在进行一些验证的同时,我可以克服这种情况C# 当它';s值为空?,c#,C#,在进行一些验证的同时,我可以克服这种情况 public override bool IsValid(object value) { if(!(value is IFileUploadInfo) && !(value is IEnumerable<IFileUploadInfo>)) throw new ArgumentException($"Cannot use {nameof(FileValidationAttribute)} in
public override bool IsValid(object value)
{
if(!(value is IFileUploadInfo) && !(value is IEnumerable<IFileUploadInfo>))
throw new ArgumentException($"Cannot use {nameof(FileValidationAttribute)} in a property that isn't of type {nameof(IFileUploadInfo)} or {nameof(IEnumerable<IFileUploadInfo>)}");
// rest ...
}
public override bool有效(对象值)
{
如果(!(值为IFileUploadInfo)和(!(值为IEnumerable))
抛出新ArgumentException($“不能在不是{nameof(IFileUploadInfo)}或{nameof(IEnumerable)}类型的属性中使用{nameof(FileValidationAttribute)}”);
//休息。。。
}
我需要测试
对象
是否属于我想要的类型,但如果值
为空
,c#会知道该对象的类型吗,即使它是空
?你不能。在中使用object
传递会删除编译时的类型。因此,你必须做一些模式匹配或铸造得到它回来。因此,null
不携带任何类型信息
您可以将该方法设置为泛型,然后就可以得到该类型
public override bool IsValid<T>(T value)
{
Type t = typeof(T);
...
// rest of code
}
public override bool有效(T值)
{
类型t=类型(t);
...
//代码的其余部分
}
否,您不能通过类型检查从null
获取类型信息
MyClass mc = null;
object obj = mc;
Console.WriteLine(obj is MyClass); // prints "False"
我们对此很清楚:
如果expr不为null,为
表达式为true,并且
你的意思是传递给方法的变量的类型,因为
null
在技术上有它自己的类型。老实说,根据类型检查,为你希望它处理的每种类型创建此方法的重载可能是有意义的。对于它的价值,“值为null的对象的类型”并不是你真正想要的。引用类型的实例实际上没有值,并且从不为null。但是,引用类型的变量可以为null。现在,可空值类型的实例可以有空值,但我不认为这是你要问的问题,你只是想看看C是否能做到?这不是比在这里问问题快吗?我同意这个问题不是很清楚,我可以自己测试一下,对此很抱歉,但感谢所有的答案。值得注意的是,如果你走这条路,那么调用IsValid(null)
将导致编译错误。如果您将其称为MyType someVar=null;IsValid(someVar)
或IsValid(null)
应该有效。如果说没有解决方案,怎么可能是找到解决方案时的解决方案呢?@OlivierRogier首先,我并不是说这个问题无法解决,我的陈述是关于使用类型检查从null中提取信息,建议的解决方案不会使用类型检查从null
中提取信息。此外,在某些情况下(出于明显的原因),它的工作原理与预期相反,例如var mc=new MyClass();对象obj=mc;IsValid(obj)代码>将以typeof(object)
结束,对于typeof(T)
内部的IsValid
。