Подтвердить что ты не робот

Определите, является ли тип статическим

Скажем, у меня есть Type, называемый Type.

Я хочу определить, могу ли я сделать это с моим типом (без фактического выполнения этого для каждого типа):

Если Type - System.Windows.Point, то я мог бы сделать это:

Point point1 = new Point();

Однако, если Type - System.Environment, тогда это не будет выполняться:

Environment environment1 = new Environment(); //wrong

Итак, если я повторяю каждый видимый тип сборки, как пропустить все типы, которые не смогут создать экземпляр, подобный второму? Я отчасти новичок в размышлениях, так что я еще не так хорош в терминологии. Надеюсь, то, что я пытаюсь сделать здесь, довольно ясно.

4b9b3361

Ответ 1

static классы объявляются abstract и sealed на уровне IL. Таким образом, вы можете проверить свойство IsAbstract для обработки классов abstract и static за один раз (для вашего варианта использования).

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

Ответ 2

type.IsAbstract && type.IsSealed

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

Ответ 3

вы можете искать таких публичных дизайнеров, как это,

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
}

Ответ 4

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));

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

Ответ 5

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

    var assembly = AppDomain.CurrentDomain.GetAssemblies()[0]; // first assembly for demo purposes
var types = assembly.GetTypes();
foreach (var type in types)
{
    var constructors = type.GetConstructors();
}