用于验证c#方法参数的泛型

时间:2012-02-26 00:00:08

标签: c# .net validation generics

所以我使用this博客文章中描述的方法设置C#参数验证。一切都适用于strings,我在此基础上设置了这个扩展方法:

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;
}

但是,当我尝试为ints添加扩展方法以确定它们是否小于或等于零时,如下所示:

public static ArgumentEx<T> NotZeroOrLess<T>(this ArgumentEx<T> arg) where T : class
{
    if (Convert.ToInt32(arg.Value.ToString()) <= 0)
    {
        throw new ArgumentException(string.Format("Please make sure {0} is greater than zero.", arg.Name));
    }
    return arg;
}

我尝试将其称为userId.RequireThat("userId").NotZeroOrLess();

时出现此错误
  

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

就像我说的那样,name.RequireThat("name").NotEmptyString();工作正常,因为namestring。我已经尝试过这样指定泛型的类型:

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

但我得到同样的错误。我不得不承认,我不太熟悉泛型。有人能解释为什么会发生这种错误吗?提前谢谢。

2 个答案:

答案 0 :(得分:1)

抛出错误是因为你定义了类约束,但是int不是一个类,它是一个值类型 - struct。阅读基础知识http://msdn.microsoft.com/en-us/library/d5x73970.aspx

阅读Why can't I use System.ValueType as a generics constraint?了解详情。

答案 1 :(得分:1)

您是否尝试从扩展方法where T : class删除public static ArgumentEx<T> NotZeroOrLess<T>(this ArgumentEx<T> arg) where T : class