Определите, статичен ли тип

29
задан Mehrdad Afshari 25 July 2009 в 10:16
поделиться

5 ответов

статические классы объявлены абстрактными и запечатанными на уровне IL. Итак, вы можете проверить свойство IsAbstract для обработки как абстрактных классов, так и статических классов за один раз (для вашего варианта использования).

Однако ] abstract классы - не единственные типы, которые вы не можете создать напрямую. Вы должны проверить такие вещи, как интерфейсы ( без атрибута CoClass ) и типы, у которых нет конструктора, доступного для вызывающего кода.

69
ответ дан 28 November 2019 в 00:49
поделиться
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));

Думаю, это должно сработать.

1
ответ дан 28 November 2019 в 00:49
поделиться
type.IsAbstract && type.IsSealed

Этого было бы достаточно для проверки C #, поскольку абстрактный класс не может быть запечатанным или статическим в C #. Однако будьте осторожны при работе с типами CLR из других языков.

15
ответ дан 28 November 2019 в 00:49
поделиться

вы можете искать такие общедоступные конструкторы,

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
}
6
ответ дан 28 November 2019 в 00:49
поделиться

Это способ получить все общедоступные конструкторы всех типов в сборке.

    var assembly = AppDomain.CurrentDomain.GetAssemblies()[0]; // first assembly for demo purposes
var types = assembly.GetTypes();
foreach (var type in types)
{
    var constructors = type.GetConstructors();
}
-3
ответ дан 28 November 2019 в 00:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: