Как обнаружить существование класса во время выполнения в .NET? - PullRequest
5 голосов
/ 27 марта 2010

Возможно ли в приложении .NET (C #) условно определить, определен ли класс во время выполнения?

Пример реализации - скажем, вы хотите создать объект класса на основе параметра конфигурации?

Ответы [ 3 ]

4 голосов
/ 27 марта 2010
string className="SomeClass";
Type type=Type.GetType(className);
if(type!=null)
{
//class with the given name exists
}

Для второй части вашего вопроса: -

Пример реализации - говорите, что хотите создать объект класса на основе опция конфигурации?

Я не знаю, почему вы хотите это сделать. Однако, если ваши классы реализуют интерфейс и вы хотите динамически создавать объекты этих классов на основе файлов конфигурации, я думаю, вы можете посмотреть на Контейнер Unity IoC . Это действительно круто и очень просто в использовании, если это соответствует вашему сценарию. Пример того, как это сделать, здесь .

3 голосов
/ 27 марта 2010

Я сделал что-то подобное , загрузил класс из Config и создал его. В этом примере мне нужно было убедиться, что класс, указанный в конфигурации, унаследован от класса с именем NinjectModule, но я думаю, что вы поняли идею.

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);
}
0 голосов
/ 27 марта 2010

Activator.CreateInstance может отвечать всем требованиям:

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

Конечно, он выдает исключение, если вы не можете создать экземпляр класса, что не совсем то же самое, что "существует" класс. Но если вы не можете создать его экземпляр и не хотите просто вызывать статические члены, это должно помочь вам.

Вы, вероятно, ищете перегрузку со строковыми параметрами, первый аргумент должен быть именем сборки, второй - именем класса (полностью определенным пространством имен).

...