Как обнаружить существование класса во времени выполнения в.NET?

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

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

5
задан John Saunders 27 March 2010 в 06:06
поделиться

3 ответа

Я сделал что-то подобное , загрузил класс из конфигурации и создал его экземпляр. В этом примере мне нужно было убедиться, что класс, указанный в конфигурации, унаследован от класса 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);
}
3
ответ дан 14 December 2019 в 08:46
поделиться
string className="SomeClass";
Type type=Type.GetType(className);
if(type!=null)
{
//class with the given name exists
}

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

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

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

4
ответ дан 14 December 2019 в 08:46
поделиться

Activator.CreateInstance может подойти:

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

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

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

0
ответ дан 14 December 2019 в 08:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: