我在我的程序集中有一堆常规,封闭和打开的类型。我有一个查询,我试图从它检测泛型类型是否打开?
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对象是表示一个打开的构造类型还是一个封闭的构造类型。' – 2014-09-12 15:19:37
您需要获取所有打开类型的类型?var types = Assembly.GetExecutingAssembly()。GetTypes() .Where(t =>!t.IsGenericTypeDefinition); – terrybozzio 2014-09-12 15:25:07
@Dark Falcon:谢谢你的输入。这也适用。我在intellisense中看到过'ContainsGenericParameters'弹出,但如果有类型的任何泛型参数,我认为它会返回true。似乎没有阅读文档 - 似乎'参数'与'参数'不一样? @terrybozzio不,相反,过滤出来:) – vexe 2014-09-12 15:25:29