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