验证c#方法参数的泛型

验证c#方法参数的泛型,c#,.net,validation,generics,C#,.net,Validation,Generics,因此,我使用博客文章中描述的方法设置C#参数验证。对于字符串,一切都很好,我在其基础上设置了此扩展方法: public static ArgumentEx<T> NotEmptyString<T>(this ArgumentEx<T> arg) where T : class { if (string.IsNullOrWhiteSpace(arg.Value.ToString())) { throw new ArgumentEx

因此,我使用博客文章中描述的方法设置C#参数验证。对于
字符串
,一切都很好,我在其基础上设置了此扩展方法:

public static ArgumentEx<T> NotEmptyString<T>(this ArgumentEx<T> arg) where T : class
{
    if (string.IsNullOrWhiteSpace(arg.Value.ToString()))
    {
        throw new ArgumentException(string.Format("{0} cannot be empty.", arg.Name));
    }
    return arg;
}
当我尝试像这样调用userId.RequireThat(“userId”).NotZeroOrLess()一样调用它时,就会出现这个错误

类型“int”必须是引用类型才能用作 泛型类型或方法中的参数“T”

就像我说的,执行
name.RequireThat(“name”).notemptysting()
工作正常,因为
名称
是一个
字符串
。我已尝试为泛型指定类型,如下所示:

userId.RequireThat<int>("userId").NotZeroOrLess();
userId.RequireThat(“userId”).NotZeroOrLess();

但我也犯了同样的错误。我必须承认,我不太精通泛型。有人能解释为什么会发生这种错误吗?提前感谢。

它会抛出错误,因为您定义了类约束,但int不是一个类,它是一个值类型-struct。阅读基础知识


阅读更多信息。

您是否尝试过从扩展方法
中删除
其中T:class
,公共静态ArgumentEx notzeroless(此ArgumentEx参数),其中T:class

就是这样做的,在阅读了Tomas发布的链接之后,我对这些事情有了更全面的理解。然而,删除它会不会在将来引起我应该注意的任何问题?谢谢您提供的Tomas链接。这些事情现在变得更有意义了:)
userId.RequireThat<int>("userId").NotZeroOrLess();