Подтвердить что ты не робот

Как использовать имя класса в качестве параметра в С#

то, что я хочу сделать, - это автоматически создать некоторый объект.

В Java класс может быть передан как параметр, например

Class A{

}


Object createObjectBy(class clazz){
       // .. do construction work here
}

when using it, just ---> createObjectBy(A.class)

это полезно для многих вещей.

так, как я могу сделать подобное в С#????

4b9b3361

Ответ 1

Object createObjectBy(Type clazz){
   // .. do construction work here
    Object theObject = Activator.CreateInstance(clazz);
    return theObject;
}

Использование:

createObjectBy(typeof(A));

Или вы можете просто использовать Activator.CreateInstance напрямую: -)

Ответ 2

Идеальный способ - использовать дженерики

Тип известен во время разработки

public static T CreateInstance<T>() where T: new()
{
    // Do some business logic
    Logger.LogObjectCreation(typeof(T));

    // Actualy instanciate the object
    return new T();
}

Пример вызова будет выглядеть как

var employee = CreateInstance<Employee>();

Тип неизвестен во время выполнения

Если тип объекта неизвестен во время выполнения, например, через систему плагинов, вам нужно использовать класс Type:

public static object CreateInstance(Type type)
{
    // Do some business logic
    Logger.LogObjectCreation(type);

    // Actualy instanciate the object
    return Activator.CreateInstance(type);
}

Пример вызова будет выглядеть как

var instance = CreateInstance(someType);

Производительность

Конечно, ничто не сравнится с объективом, чем с помощью ключевого слова new. За исключением, может быть, не instanciation, но вместо повторного использования объекта, например, путем кеширования.

Если вам нужно решить второй метод, когда тип неизвестен, несколько альтернатив до Activator.CreateInstance. Хотя в статье рекомендуется использовать выражение лямбда, ваше самое большое соображение:

  • Требуется ли создание неизвестного объекта часто за короткий промежуток времени или вы создаете его только один раз.

Если вам нужно только создать свой объект один раз, просто придерживайтесь метода Activator.CreateInstance. Если вам нужно создать его несколько раз за короткое время, попробуйте лямбда-подход. Этот последний подход похож на скомпилированное регулярное выражение против регулярного выражения "на лету".

Ответ 3

Используйте тип класса. Вы можете вернуть его экземпляр по вызову

obj.GetType();

или без экземпляра объекта

typeof(className);

Надеюсь, это поможет.

Ответ 4

С# не поддерживает это. Но что вы пытаетесь сделать?

Возможно, вы могли бы использовать:

createObjectBy(Type type);

или

createObjectBy<T>();