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

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

通常我们会这样做:

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

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


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

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

谢谢。

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

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

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

如前所述,您无法更改属性名称; 例如,你会如何编码呢? 但是,如果这是用于数据绑定,则可以执行一些技巧来在运行时弯曲属性的显示名称 – 例如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生成的魔法与数据库或其他东西)。

动态属性可以在运行时编译代码完成,但这对你的需求来说太过分了我猜…

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