Определите, является ли тип статическим
Скажем, у меня есть Type
, называемый Type
.
Я хочу определить, могу ли я сделать это с моим типом (без фактического выполнения этого для каждого типа):
Если Type
- System.Windows.Point
, то я мог бы сделать это:
Point point1 = new Point();
Однако, если Type
- System.Environment
, тогда это не будет выполняться:
Environment environment1 = new Environment(); //wrong
Итак, если я повторяю каждый видимый тип сборки, как пропустить все типы, которые не смогут создать экземпляр, подобный второму? Я отчасти новичок в размышлениях, так что я еще не так хорош в терминологии. Надеюсь, то, что я пытаюсь сделать здесь, довольно ясно.
Ответы
Ответ 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();
}