문제

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);
        }
도움이 되었습니까?

해결책

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
}

다른 팁

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.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top