测试泛型方法参数是一个类

Cra*_*aig 2 c# generics constraints

我有一个使用此签名的通用方法:

private void MyGenericMethod<T>(T arg) where T : class
{}
Run Code Online (Sandbox Code Playgroud)

如果我传递一个整数给这个方法,我得到一个ArgumentException,传递的值与限制不匹配.这很好,但我怎么能预先确定我传递的内容是否与"类"约束匹配,以便不抛出异常?

Mar*_*ell 5

编译器已经为你做了 - 你应该看到:

类型'int'必须是引用类型才能在泛型类型或方法'blah.MyGenericMethod(T)'中将其用作参数'T'

在编译时.

棘手的情况是:

  • 泛型泛型上的泛型 - 所有那些类型约束堆栈,所以你最终得到where T : class 了很多.有时最好使用运行时验证T
  • 反射(MakeGenericMethod等) - 再次,只需在运行时检查

另外,请注意,where T : class 实际上并不意味着T是一个类 - 这意味着它是一个引用类型,可以包括接口和委托.同样,where T : struct并不意味着实际上T是一个struct-这意味着它是一个结构,是不是Nullable<>.