Динамически установить имя свойства анонимного типа C # - PullRequest
10 голосов
/ 29 октября 2009

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

Обычно мы делаем так:

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

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


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

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

Спасибо.

Ответы [ 6 ]

4 голосов
/ 29 октября 2009

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

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

2 голосов
/ 29 октября 2009

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

1 голос
/ 29 октября 2009

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

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

0 голосов
/ 29 октября 2009

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

0 голосов
/ 29 октября 2009

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

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

...