статические
классы объявлены абстрактными
и запечатанными
на уровне IL. Итак, вы можете проверить свойство IsAbstract
для обработки как абстрактных
классов, так и статических
классов за один раз (для вашего варианта использования).
Однако ] abstract
классы - не единственные типы, которые вы не можете создать напрямую. Вы должны проверить такие вещи, как интерфейсы ( без атрибута CoClass
) и типы, у которых нет конструктора, доступного для вызывающего кода.
Type t = typeof(System.GC);
Console.WriteLine(t.Attributes);
TypeAttributes attribForStaticClass = TypeAttributes.AutoLayout | TypeAttributes.AnsiClass | TypeAttributes.Class |
TypeAttributes.Public | TypeAttributes.Abstract | TypeAttributes.Sealed | TypeAttributes.BeforeFieldInit;
Console.WriteLine((t.Attributes == attribForStaticClass));
Думаю, это должно сработать.
type.IsAbstract && type.IsSealed
Этого было бы достаточно для проверки C #, поскольку абстрактный класс не может быть запечатанным или статическим в C #. Однако будьте осторожны при работе с типами CLR из других языков.
вы можете искать такие общедоступные конструкторы,
Type t = typeof(Environment);
var c = t.GetConstructors(BindingFlags.Public);
if (!t.IsAbstract && c.Length > 0)
{
//You can create instance
}
Или, если вас интересует только конструктор без параметров, вы можете использовать
Type t = typeof(Environment);
var c = t.GetConstructor(Type.EmptyTypes);
if (c != null && c.IsPublic && !t.IsAbstract )
{
//You can create instance
}
Это способ получить все общедоступные конструкторы всех типов в сборке.
var assembly = AppDomain.CurrentDomain.GetAssemblies()[0]; // first assembly for demo purposes
var types = assembly.GetTypes();
foreach (var type in types)
{
var constructors = type.GetConstructors();
}