Question

Currently when I have a class type and need to know if the class can be created. I will call Activator.CreateInstance(type); and throw away the result.

This seems very inefficient and problematic.

Is there an alternative way to confirm that a class type can be instantiated for the current application?

I need to do this test as part of the application startup. To ensure that any misconfiguration is caught early. If I leave it until an instance of the class is required, then the error could occur when no one is around to fix it.

Here is what I do now.

        string className = string.Format("Package.{0}.{1}", pArg1, pArg2);
        Type classType = Type.GetType(className);
        if (classType == null)
        {
            throw new Exception(string.Format("Class not found: {0}", className));
        }

        try
        {
            // test creating an instance of the class.
            Activator.CreateInstance(classType);
        }
        catch (Exception e)
        {
            logger.error("Could not create {0} class.", classType);
        }
Was it helpful?

Solution

Based on what can be found here, you could test whether the type contains a parameterless constructor (which classes will by default when not provided), and whether the type is not abstract:

if(classType.GetConstructor(Type.EmptyTypes) != null && !classType.IsAbstract)
{
     //this type is constructable with default constructor
}
else
{
   //no default constructor
}

OTHER TIPS

Using System.Runtime.Serialization.FormatterServices.GetUninitializedObject(type) will instantiate the object but will not call upon the constructor. It renders a zeroed out instance of the class. The class must be accessible or an exception is thrown. If your class has verbose startup code then this may improve on efficiency.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top