У меня есть куча обычных, закрытых и открытых типов в моей сборке. У меня есть запрос, который я пытаюсь исключить открытые виды из негоОбнаруживать, открыт ли общий тип?
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, чтобы определить, является ли объект типа открытым построенным типом или закрытым построенным типом. ' –
Вам нужно получить все типы, которые являются открытым типом? ... var types = Assembly.GetExecutingAssembly(). GetTypes() . Где (t =>! T.IsGenericTypeDefinition); – terrybozzio
@ Dark Falcon: Спасибо за ваш вклад. Это тоже работает. Я видел всплывающее окно ContainsGenericParameters в intellisense, но я думал, что он возвращает true, если есть какие-либо общие аргументы для типа. Кажется, что не так читать документ - кажется, что «аргумент» не совпадает с «параметром»? @terrybozzio no, напротив, отфильтровать их :) – vexe