В C # как получить доступ к конструктору фигурных скобок, используя отражение? - PullRequest
4 голосов
/ 28 февраля 2011

В C # теперь мы можем создавать новые объекты с помощью конструктора фигурных скобок, т.е.

class Person {
   readonly string FirstName {get; set;}
   readonly string LastName {get; set;}
}

new Person { FirstName = "Bob", LastName = "smith" }

Мне нужно построить этот объект с помощью отражения, но если эти переменные-члены помечены только для чтения, я могу установить их только в конструкторе, и доступен только конструктор фигурных скобок. Есть ли какой-нибудь способ получить доступ к конструктору в виде фигурных скобок с помощью отражения? Спасибо.

Ответы [ 4 ]

24 голосов
/ 28 февраля 2011

Во-первых, свойства не могут быть помечены только для чтения с ключевым словом readonly. Они могут иметь только закрытые методы установки.

Во-вторых, не существует такой вещи, как «конструктор фигурных скобок». Это просто синтаксический сахар (ярлык) для набора операторов вроде этого:

Person p = new Person();  // standard parameterless constructor is called
p.FirstName = "Bob";
p.LastName = "Smith";

Обратите внимание, что вы также можете использовать конструктор с параметрами:

new Person(1, 2, 3) { FirstName = "Bob", LastName = "Smith" }

переводится как:

Person p = new Person(1, 2, 3);
p.FirstName = "Bob";
p.LastName = "Smith";

Относительно отражения: чтобы создать новый экземпляр и инициализировать его так же, как в примере new Person { FirstName = "Bob", LastName = "Smith" }, вам необходимо:

  1. получить конструктор (см. Type.GetConstructor) и вызвать его или , использовать Activator.CreateInstance для создания экземпляра типа,
  2. получить свойство FirstName (см. Type.GetProperty),
  3. установить его (см. PropertyInfo.SetValue),
  4. повторите (2) и (3) для LastName.
4 голосов
/ 28 февраля 2011

Это не имеет отношения к конструктору.Это просто краткий синтаксис для инициализации нормальных свойств.

new Person { FirstName = "Bob", LastName = "smith" };

точно такой же, как

var person = new Person();
person.FirstName = "Bob";
person.LastName = "smith";

И, как говорили люди.Ваш пример не скомпилируется.Потому что это не конструктор.

1 голос
/ 28 февраля 2011

Как вы можете скомпилировать это? C # сообщает об ошибке:

error CS0106: The modifier 'readonly' is not valid for this item
0 голосов
/ 28 февраля 2011

Я предполагаю, что вы имеете в виду частные установщики poperty вместо свойств только для чтения (get и set являются сокращением для полных методов получения и установки). Затем вам нужно будет сделать что-то вроде этого, чтобы задать свойства отражательно:

Type personType= typeof(Person);
object personInstance = Activator.CreateInstance(personType);
personInstance.GetProperty("FirstName").SetValue(classObject, "Bob, null);
personInstance.GetProperty("LastName").SetValue(classObject, "smith, null);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...