2016-09-29 2 views
0

Пытается написать утилиту отображения данных, управляемую данными. Но мне нужно иметь возможность инициализировать объекты (строки в списке), ссылаясь на имена свойств (столбцов) в качестве переменных.C# объект инициализации - можно ссылаться на свойства по нелитеральному имени?

Так, например, вместо этого:

var p = new person {name = "Joe", age = 10} 

я могу сделать что-то вроде ...

string prop1 = "name", prop2 = "age"; 
var p = new person {[prop1] = "Joe", [prop2] = 10} 

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

var p = new person {prop[1] = "Joe", prop[2] = 10} 

... или неявным образом заказывать их, просто отбрасывая имена свойств, предполагая свойства wo uld подразумевается ...

var p = new person {"Joe", 10} 
+2

Если вы не смотреть на отражение? Инициализаторы объектов - это всего лишь синтаксический сахар для сеттеров. Они не влияют на то, как вы работаете с объектом вообще –

+0

Может быть, словарь для 'string' и' object' был бы лучшей идеей для источника? – kiziu

+1

@KarlRKaiser, что вы на самом деле пытаетесь сделать? Какую * актуальную проблему вы пытаетесь решить? Очевидно, что вы хотите каким-то образом установить свойства динамически, но почему? Разве это не удалось бы решить, например, с помощью AutoMapper или аналогичного инструмента? –

ответ

1

Вы можете использовать person.GetType().GetProperty(prop1).SetValue(person,"Joe"); Конечно, вам нужно добавить nullchecking на GetProperty.

+0

Другими словами, используйте Reflection. –

+0

Это правильно – Hintham

+0

Спасибо, это именно то, что я ищу. Можете также спросить: есть ли способ * также * ссылаться на объект как динамическое имя, так что все выражение присваивания не будет иметь литеральный объект или имя свойства. – KarlRKaiser

4

Нет, вы не можете этого сделать. Единственное, что вы можете сделать для достижения этой цели является использование отражения для задания свойств:

var p = new person(); 
var nameProp = typeof(person).GetProperty('name'); 
nameProp.SetValue(p, "Joe"); 

иметь неявный порядок свойств можно объявить конструктор:

class person 
{ 
    public string name {get;set;} 
    //... 
    person(string name, int age){ 
     this.name = name; 
     //... 
    } 

и называют

new person("Joe",44); 
+0

... так ** typeof (person) .GetProperty («имя») ** является ссылкой на само свойство, которое можно использовать для присвоения значения? Похоже, это сработает. – KarlRKaiser

+0

Тип судна; Его объект, который позволяет получить доступ ко всем метаданным относительно свойства и позволяет установить его значение. Тем не менее я бы посоветовал не использовать большое отражение в любом проекте. Вы должны прочитать больше об этом, прежде чем начать использовать его. – Rafal

+0

Если я могу установить значение свойства, указав его через метаданные или как оцениваемое свойство/datum, а не его буквальное имя, все будет в порядке. Я не знаю, могу ли я назвать использование «тяжелым», но сопоставление данных всегда срабатывало лучше всего благодаря управляемой данными системе на основе правил из-за гибкости, которую она предлагает при настройке или изменении правил сопоставления, не требуя повторной компиляции и развертывание кода. Тогда, если это сработает, я вернусь и спрошу, как ссылаться на ОБЪЕКТЫ как метаданные ;-) – KarlRKaiser

0

Ближайший будет использовать отражение:

var person = new Person(); 
person.GetType().GetProperty("Name").SetValue(person, "Joe"); 
Смежные вопросы