所以我使用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();
工作正常,因为name
是string
。我已经尝试过这样指定泛型的类型:
userId.RequireThat<int>("userId").NotZeroOrLess();
但我得到同样的错误。我不得不承认,我不太熟悉泛型。有人能解释为什么会发生这种错误吗?提前谢谢。
答案 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
?