静态类可以通过反射

时间:2017-04-28 19:14:17

标签: c# .net reflection clr

当尝试使用静态类作为类型参数时,C#编译器将抛出错误:

var test = new List<Math>();

  

错误CS0718:`System.Math&#39;:静态类不能用作通用参数

这些问题已经涵盖了这些问题:

然而,我刚刚意识到我可以通过反射创建类型,运行时不会抱怨:

var test = Activator.CreateInstance(typeof(List<>).MakeGenericType(typeof(Math)));

我是否正确地得出结论,CLR级别支持此功能,但语言级别不支持?

或者这是规范中的灰色区域,这意味着我应该避免使用这些通用的构造类型吗?

1 个答案:

答案 0 :(得分:3)

正如BJ Myers的评论所述,CLR并不了解“静态”类。编译器错误会阻止您执行可能导致严重问题的事情。几乎总有办法解决大多数这样的错误(在这种情况下使用反射),但尝试将静态类作为参数传递时的错误表明你不应该做你正在做的事情,除非你非常清楚会产生什么后果。

在这种情况下,您应该问自己,为什么要传递静态类?由于静态类不能引用数据或其他对象,因此没有必要通过它。如果需要在静态类上调用函数而不显式引用它,则可以使用反射来调用其方法。这是一个解释说明的答案:

Invoking static methods with reflection