我在我的程序集中有许多常规、封闭和公开类型。我有一个查询,试图从中排除公开类型。
class Foo { } // a regular type
class Bar<T, U> { } // an open type
class Moo : Bar<int, string> { } // a closed type
var types = Assembly.GetExecutingAssembly().GetTypes().Where(t => ???);
types.Foreach(t => ConsoleWriteLine(t.Name)); // should *not* output "Bar`2"
当我调试一个开放类型的通用参数时,我发现它们的FullName是空的(以及其他的一些东西,比如DeclaringMethod)- 所以这可能是一种方式:
bool IsOpenType(Type type)
{
if (!type.IsGenericType)
return false;
var args = type.GetGenericArguments();
return args[0].FullName == null;
}
Console.WriteLine(IsOpenType(typeof(Bar<,>))); // true
Console.WriteLine(IsOpenType(typeof(Bar<int, string>))); // false
有没有内置的方法可以知道一个类型是否是开放的?如果没有,有更好的方式吗?谢谢。
IsGenericType
的文档吗?使用ContainsGenericParameters
属性来确定一个Type对象是表示开放构造类型还是封闭构造类型。 - Dark FalconContainsGenericParameters
,但我认为它会在类型中有任何泛型参数时返回 true。阅读文档似乎并非如此 - 看起来 'argument' 不同于 'parameter'?@terrybozzio 不是,相反,要将它们过滤掉 :) - vexe