Действительно ли возможно в приложении.NET (C#), условно обнаружить, если класс определяется во времени выполнения?
Демонстрационная реализация - говорит, что Вы хотите создать объект класса на основе параметра конфигурации?
Я сделал что-то подобное , загрузил класс из конфигурации и создал его экземпляр. В этом примере мне нужно было убедиться, что класс, указанный в конфигурации, унаследован от класса 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);
}
string className="SomeClass";
Type type=Type.GetType(className);
if(type!=null)
{
//class with the given name exists
}
Для второй части вашего вопроса: -
Пример реализации - скажем, вы хотите, чтобы создал объект класса на основе { {1}} вариант конфигурации?
Я не знаю, зачем вам это нужно.Однако, если ваши классы реализуют интерфейс и вы хотите динамически создавать объекты этих классов на основе файлов конфигурации, я думаю, вы можете посмотреть контейнер Unity IoC . Это действительно круто и очень просто в использовании, если оно соответствует вашему сценарию. Пример того, как это сделать, находится здесь .
Activator.CreateInstance может подойти:
http://msdn.microsoft.com/en-us/library/system.activator.createinstance.aspx
Конечно, он выбрасывает исключение, если вы не можете создать класс, что не совсем то же самое, что "существует" ли класс. Но если вы не можете его создать и не хотите просто вызывать статические члены, это должно помочь вам.
Вы, вероятно, ищете перегрузку со строковыми параметрами, первым аргументом должно быть имя сборки, вторым - имя класса (полностью выверенное по пространству имен).