Olaseni
Olaseni

Reputation: 7916

How to detect the existence of a class at runtime in .NET?

Is it possible in a .NET app (C#), to conditionally detect if a class is defined at runtime?

Sample implementation - say you want to create a class object based on a configuration option?

Upvotes: 5

Views: 11293

Answers (4)

Alejandro Aranda
Alejandro Aranda

Reputation: 749

My static function versión:

/// <summary>
/// returns if the class exists in the current context
/// </summary>
/// <param name="className">Class Name</param>
/// <returns>class status</returns>
public static bool ClassExist(string className)
{
    Type type = Type.GetType(className);
    if (type != null)
    {
        return true;
    }
    return false;
}

Upvotes: 0

Michael Stum
Michael Stum

Reputation: 180884

I've done something like that, load a class from the Config and instantiate it. In this example, I needed to make sure the class specified in the config inherited from a class called NinjectModule, but I think you get the idea.

protected override IKernel CreateKernel()
{
    // The name of the class, e.g. retrieved from a config
    string moduleName = "MyApp.MyAppTestNinjectModule";

    // Type.GetType takes a string and tries to find a Type with
    // the *fully qualified name* - which includes the Namespace
    // and possibly also the Assembly if it's in another assembly
    Type moduleType = Type.GetType(moduleName);

    // If Type.GetType can't find the type, it returns Null
    NinjectModule module;
    if (moduleType != null)
    {
        // Activator.CreateInstance calls the parameterless constructor
        // of the given Type to create an instace. As this returns object
        // you need to cast it to the desired type, NinjectModule
        module = Activator.CreateInstance(moduleType) as NinjectModule;
    }
    else
    {
        // If the Type was not found, you need to handle that. You could instead
        // initialize Module through some default type, for example
        // module = new MyAppDefaultNinjectModule();
        // or error out - whatever suits your needs
        throw new MyAppConfigException(
             string.Format("Could not find Type: '{0}'", moduleName),
             "injectModule");
    }

    // As module is an instance of a NinjectModule (or derived) class, we
    // can use it to create Ninject's StandardKernel
    return new StandardKernel(module);
}

Upvotes: 3

Ashish Gupta
Ashish Gupta

Reputation: 15139

string className="SomeClass";
Type type=Type.GetType(className);
if(type!=null)
{
//class with the given name exists
}

For the second part of your question :-

Sample implementation - say you want to create a class object based on a configuration option?

I dont know why you want to do that. However, If your classes implement an interface and you want to dynamically create objects of those classes based on configuration files, I think you can look at Unity IoC container. Its really cool and very easy to use If it fits your scenario. An example on how to do that is here.

Upvotes: 5

richardtallent
richardtallent

Reputation: 35363

Activator.CreateInstance may fit the bill:

http://msdn.microsoft.com/en-us/library/system.activator.createinstance.aspx

Of course, it throws an exception if you can't instantiate the class, which isn't exactly the same thing as whether the class "exists". But if you can't instantiate it and you aren't looking to just call static members, it should do the trick for you.

You're probably looking for the overload that has string parameters, the first argument should be the name of the assembly, the second being the name of the class (fully namespace-qualified).

Upvotes: 0

Related Questions