有没有办法动态设置匿名类型的属性名称?
通常我们会这样做:
var anon = new { name = "Kayes" };
现在我想动态设置属性的名称(或标识符),以便此名称可以来自XML文件或数据库。
谢谢你的回答。不,我的需要绝对不值得所有繁琐的选择。我只是想让我的代码符合我的团队负责人开发的现有库。但我们决定更新库以支持Dictionary类型,以便轻松解决。
Pete,我很高兴了解.NET 4.0中的动态类型
感谢。
答案 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)
不。您希望从动态信息构建静态结构。不会工作,想一想。为您的案例使用字典。