Подтвердить что ты не робот

Динамически установить имя свойства анонимного типа С#

Есть ли способ динамически установить имя свойства анонимного типа?

Обычно мы будем делать следующее:

var anon = new { name = "Kayes" };

Теперь я хотел бы задать имя (или идентификатор) свойства динамически, так что это имя может быть получено из XML файла или базы данных.


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

Пит, я очень рад узнать о динамических типах в .NET 4.0

Спасибо.

4b9b3361

Ответ 1

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

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

Ответ 2

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

Ответ 3

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

Ответ 4

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

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

Ответ 6

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