Может кто-нибудь Activator.CreateInstance()
подробно объяснить цель?
c#
.net
reflection
Тебриз Атайи
источник
источник
CreateInstance(Type type)
была согласована сCreateInstance<T>()
перегрузкой.c#.net
способObject xyz = Class.forName(className).newInstance();
.Ответы:
Допустим, у вас есть класс, который называется
MyFancyObject
ниже:Он позволяет превратить:
В
С помощью
а затем может делать такие вещи, как:
Это его цель. Он также имеет много других перегрузок, таких как предоставление
Type
вместо имени класса в строке. Другое дело, почему у вас возникла такая проблема. Вот некоторые люди, которым это было нужно:источник
String ClassName = "My.Namespace.MyFancyObject";
).obj = (MyFancyObject)Activator.CreateInstance("MyAssembly", ClassName))
но вместо приведения типа. Отливать с типом из ClassName? Как этоType type = Type.GetType(ClassName);obj = (type )Activator.CreateInstance("MyAssembly", ClassName))
?Что ж, я могу привести вам пример, почему использовать что-то подобное. Подумайте об игре, в которой вы хотите сохранить свой уровень и врагов в XML-файле. Когда вы разбираете этот файл, у вас может быть такой элемент.
теперь вы можете создавать динамически объекты, найденные в вашем файле уровня.
Это очень полезно для создания динамических сред. Конечно, это также можно использовать для сценариев плагинов или надстроек и многого другого.
источник
Мой хороший друг MSDN может объяснить вам это на примере
Вот код на случай, если ссылка или контент изменится в будущем:
источник
Вы также можете сделать это -
источник
.Unwrap()
что именно и как это связано с другими решениями?CreateInstance
где он возвращаетсяSystem.Runtime.Remoting.ObjectHandle
.Хорошим примером может быть следующий: например, у вас есть набор регистраторов, и вы позволяете пользователю указывать тип, который будет использоваться во время выполнения, через файл конфигурации.
Затем:
ИЛИ другой случай, когда у вас есть фабрика общих сущностей, которая создает сущность, а также отвечает за инициализацию сущности данными, полученными из БД:
(Псевдокод)
источник
typeof(loggerType)
результатloggerType is a variable and used like a type
Activator.CreateInstance
Метод создает экземпляр указанного типа , используя конструктор , который наилучшим образом соответствует указанным параметрам.Например, предположим, что у вас есть имя типа в виде строки, и вы хотите использовать строку для создания экземпляра этого типа. Вы можете использовать
Activator.CreateInstance
для этого:Вот статья MSDN, в которой более подробно объясняется его применение:
http://msdn.microsoft.com/en-us/library/wccyzw83.aspx
источник
new Foo()
. Я думаю, ОП хотел более реалистичный пример.CreateInstance
заключается в том, что вы не знаете тип объекта, который вы собираетесь создать во время разработки. В этом примере вы четко знаете, что это тип,Foo
поскольку вы приводите его как типFoo
. Вы бы никогда этого не сделали, потому что можете просто сделатьFoo foo = new Foo()
.Основываясь на deepee1 и этом , вот как принять имя класса в строке, а затем использовать его для чтения и записи в базу данных с помощью LINQ. Я использую «динамический» вместо приведения deepee1, потому что он позволяет мне назначать свойства, что позволяет нам динамически выбирать и работать с любой таблицей, которую мы хотим.
источник
Зачем вам его использовать, если вы уже знали класс и собирались его использовать? Почему бы просто не сделать это старомодным способом и не сделать класс таким, как всегда? В этом нет никаких преимуществ перед обычным способом. Есть ли способ взять текст и работать с ним следующим образом:
Если я уже знаю, что это пицца, нет никаких преимуществ:
но я вижу огромное преимущество метода Magic, если он существует.
источник
В сочетании с отражением я обнаружил, что Activator.CreateInstance очень полезен при сопоставлении результата хранимой процедуры с настраиваемым классом, как описано в следующем ответе .
источник