Динамично определите имя свойства анонимного типа C#

Снова немного вне темы, но я буду второй замок ActiveRecord - вместо того, чтобы использовать базу данных в качестве Вашей модели (Дозвуковой подход), или провести часы в спагетти XML (подход NHibernate) Вы просто помещаете атрибуты в свои образцовые классы.

можно даже добраться, ActiveRecord к генерируют схему базы данных для Вас.

Мы использовали этот подход к довольно многим проектам теперь, и преимущества следующие:

  • путь Простого обновления к NHibernate при необходимости в будущем
  • Поддержка простые модели наследования - например, Автомобиль-> Механизм
  • схема, которую это генерирует, наиболее вероятна, как Вы создали бы его так или иначе, таким образом, можно провести больше времени, создавая приложение вместо того, чтобы волноваться о хранении модели/дб в синхронизации.

10
задан Bill the Lizard 7 October 2011 в 00:28
поделиться

6 ответов

Это невозможно, потому что даже если тип анонимный, это не динамический тип. Это все еще статический тип, и свойства о нем должны быть известны во время компиляции.

Вы можете проверить ключевое слово .NET 4.0 "dynamic" для создания истинных динамических классов.

4
ответ дан 4 December 2019 в 02:50
поделиться

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

2
ответ дан 4 December 2019 в 02:50
поделиться

Как уже упоминалось, вы не можете изменить имя свойства; как бы вы, например, могли противостоять этому? Однако, если это для привязки данных, вы можете использовать некоторые трюки, чтобы изменить отображаемое имя свойств во время выполнения, например 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);
        }
    }
}
1
ответ дан 4 December 2019 в 02:50
поделиться

Нет. Вы хотите построить статическую структуру из динамической информации. Не получится, подумай. Используйте словарь для вашего случая.

0
ответ дан 4 December 2019 в 02:50
поделиться

Компилятор должен знать имя свойства, иначе он не сможет создать для вас анонимный тип.

Итак, нет, это невозможно, если только фактическое имя свойства не известно во время компиляции (с помощью какой-то магии, созданной VS с базой данных или чего-то еще).

0
ответ дан 4 December 2019 в 02:50
поделиться

Dynamic properties can be done with compiling code at runtime but this would be overkill for your needs I guess...

0
ответ дан 4 December 2019 в 02:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: