动态设置C#匿名类型的属性名称

时间:2009-10-29 10:22:03

标签: c# properties anonymous-types

有没有办法动态设置匿名类型的属性名称?

通常我们会这样做:

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

现在我想动态设置属性的名称(或标识符),以便此名称可以来自XML文件或数据库。


谢谢你的回答。不,我的需要绝对不值得所有繁琐的选择。我只是想让我的代码符合我的团队负责人开发的现有库。但我们决定更新库以支持Dictionary类型,以便轻松解决。

Pete,我很高兴了解.NET 4.0中的动态类型

感谢。

6 个答案:

答案 0 :(得分:4)

这是不可能的,因为即使该类型是匿名的,它也不是动态类型。它仍然是一个静态类型,必须在编译时知道它的属性。

您可能需要查看.NET 4.0“dynamic”关键字以生成真正的动态类。

答案 1 :(得分:2)

不是没有大量的反思,可能比你对利用你正在做的事情感兴趣更多。也许您应该考虑使用Dictionary,键值是属性名称。

答案 2 :(得分:1)

如前所述,您无法更改属性名称;例如,你会如何编码呢?但是,如果这是用于数据绑定,您可以执行一些技巧来在运行时弯曲属性的显示名称 - 例如ICustomTypeDescriptor / TypeDescriptionProvider(以及自定义PropertyDescriptor)。< / p>

很多工作;它需要真的值得...

另一个选项是自定义属性:

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);
        }
    }
}

答案 3 :(得分:0)

编译器必须知道属性名称,否则无法为您创建匿名类型。

所以,不,这是不可能的,除非在编译时知道实际的属性名称(通过一些VS生成的魔法与数据库或其他东西)。

答案 4 :(得分:0)

动态属性可以使用compiling code at runtime来完成,但这对你的需求来说太过分了我猜...

答案 5 :(得分:0)

不。您希望从动态信息构建静态结构。不会工作,想一想。为您的案例使用字典。