Determine if a type is static
Solution 1
static
classes are declared abstract
and sealed
at the IL level. So, you can check IsAbstract
property to handle both abstract
classes and static
classes in one go (for your use case).
However, abstract
classes are not the only types you can't instantiate directly. You should check for things like interfaces (without the CoClass
attribute) and types that don't have a constructor accessible by the calling code.
Solution 2
type.IsAbstract && type.IsSealed
This would be a sufficient check for C# since an abstract class cannot be sealed or static in C#. However, you'll need to be careful when dealing with CLR types from other languages.
Solution 3
you can search for public contructors like this,
Type t = typeof(Environment);
var c = t.GetConstructors(BindingFlags.Public);
if (!t.IsAbstract && c.Length > 0)
{
//You can create instance
}
Or if you only interested in parameterless constructor you can use
Type t = typeof(Environment);
var c = t.GetConstructor(Type.EmptyTypes);
if (c != null && c.IsPublic && !t.IsAbstract )
{
//You can create instance
}
Solution 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));
I guess, this should work.
Beaker
Updated on June 05, 2022Comments
-
Beaker almost 2 years
Let's say I have a
Type
calledtype
.I want to determine if I can do this with my type (without actually doing this to each type):
If
type
isSystem.Windows.Point
then I could do this:Point point1 = new Point();
However if
type
isSystem.Environment
then this will not fly:Environment environment1 = new Environment(); //wrong
So if I am iterating through every visible type in an assembly how do I skip all the types that will fail to create an instance like the second one? I'm kind of new to reflection so I'm not that great with the terminology yet. Hopefully what I'm trying to do here is pretty clear.
-
mmx almost 15 yearsNote that an
abstract
class can have apublic
constructor. You can't necessarily create an instance of a class in the body of yourif
statement. You'll getMemberAccessException
. -
Beaker almost 15 yearsThanks for the answer, it would have taken me a long time to come up with this on my own.
-
mhand over 2 yearsI believe the only one unique to static classes is the
TypeAttributes.BeforeFieldInit
-- this is what I use to determine static classes. CheckingIsAbstract
andIsSealed
also guarantees only static types but it's a more involved check.