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

10

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

通常我们会这样做:

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

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


谢谢大家的回答。不,我的需求绝对不值得所有繁琐的替代方案。我只是想让我的代码符合由我的团队领导开发的现有库。但我们决定更新该库以支持字典类型,这样就可以轻松解决了。

Pete,我真的很兴奋能够学习.NET 4.0中的动态类型。

谢谢。


请参阅更近期的C#版本:https://dev59.com/RG865IYBdhLWcg3wlvqq - nawfal
6个回答

4

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

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


2

如果你要做的事情需要大量思考,可能比你想象的还要多。也许你应该考虑使用字典,以属性名作为键值。


1
如前所述,您无法更改属性名称;例如,您将如何编写针对其的代码?但是,如果这是用于数据绑定,则可以在运行时执行某些技巧以弯曲属性的显示名称-例如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
编译器必须知道属性名称,否则它无法为您创建匿名类型。
因此,除非在编译时(通过某些与数据库或其他内容生成的魔术)实际属性名称已知,否则这是不可能的。

0

动态属性可以通过运行时编译代码来实现,但我猜这对你的需求来说有点过头了...


0

不行。你想从动态信息构建静态结构。这样做行不通,好好想想。对于你的情况,使用字典。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接