Снова немного вне темы, но я буду второй замок ActiveRecord - вместо того, чтобы использовать базу данных в качестве Вашей модели (Дозвуковой подход), или провести часы в спагетти XML (подход NHibernate) Вы просто помещаете атрибуты в свои образцовые классы.
можно даже добраться, ActiveRecord к генерируют схему базы данных для Вас.
Мы использовали этот подход к довольно многим проектам теперь, и преимущества следующие:
Это невозможно, потому что даже если тип анонимный, это не динамический тип. Это все еще статический тип, и свойства о нем должны быть известны во время компиляции.
Вы можете проверить ключевое слово .NET 4.0 "dynamic" для создания истинных динамических классов.
Не обошлось и без огромного количества размышлений, вероятно, больше, чем вы заинтересованы в использовании того, что вы делаете. Возможно, вам стоит вместо этого изучить словарь, в котором значением ключа является имя свойства.
Как уже упоминалось, вы не можете изменить имя свойства; как бы вы, например, могли противостоять этому? Однако, если это для привязки данных, вы можете использовать некоторые трюки, чтобы изменить отображаемое имя свойств во время выполнения, например ICustomTypeDescriptor
/ TypeDescriptionProvider
(и настраиваемый PropertyDescriptor
).
Много работы; это должно быть действительно того стоит ...
Другой вариант - настраиваемый атрибут:
using System;
using System.ComponentModel;
using System.Windows.Forms;
class MyDisplayNameAttribute : DisplayNameAttribute {
public MyDisplayNameAttribute(string value) : base(value) {}
public override string DisplayName {
get {
return @"/// " + base.DisplayNameValue + @" \\\";
}
}
}
class Foo {
[MyDisplayName("blip")]
public string Bar { get; set; }
[STAThread]
static void Main() {
Application.EnableVisualStyles();
using (Form form = new Form {
Controls = {
new PropertyGrid {
Dock = DockStyle.Fill,
SelectedObject = new Foo { Bar = "abc"}}
}
}) {
Application.Run(form);
}
}
}
Нет. Вы хотите построить статическую структуру из динамической информации. Не получится, подумай. Используйте словарь для вашего случая.
Компилятор должен знать имя свойства, иначе он не сможет создать для вас анонимный тип.
Итак, нет, это невозможно, если только фактическое имя свойства не известно во время компиляции (с помощью какой-то магии, созданной VS с базой данных или чего-то еще).
Dynamic properties can be done with compiling code at runtime but this would be overkill for your needs I guess...