C# 匿名类的DisplayNameAttribute

C# 匿名类的DisplayNameAttribute,c#,anonymous-types,C#,Anonymous Types,如果我有这样一个非匿名类,我知道我可以像这样使用DisplayNameAttribute class Record{ [DisplayName("The Foo")] public string Foo {get; set;} [DisplayName("The Bar")] public string Bar {get; set;} } 但我有 var records = (from item in someCollection

如果我有这样一个非匿名类,我知道我可以像这样使用
DisplayNameAttribute

class Record{

    [DisplayName("The Foo")]
    public string Foo {get; set;}

    [DisplayName("The Bar")]
    public string Bar {get; set;}

}
但我有

var records = (from item in someCollection
               select{
                   Foo = item.SomeField,
                   Bar = item.SomeOtherField,
               }).ToList();

我使用
记录
作为
数据源
作为数据网格。列标题显示为
Foo
Bar
,但它们必须是
Foo
Bar
。由于一些不同的内部原因,我无法创建一个具体的类,它必须是一个匿名类。有鉴于此,我是否可以为这个匿名类的成员设置
DisplayNameAttrubute

我试过了

[DisplayName("The Foo")] Foo = item.SomeField
但它不会编译


谢谢。

据我所知,您不能将属性应用于匿名类型。编译器根本不支持它。你可以真正离开马车,使用像Muno。塞西尔这样的后建步骤来放置属性,但这不是你想考虑的。为什么必须匿名?

以下解决方案如何:

dataGrid.SetValue(
    DataGridUtilities.ColumnHeadersProperty,
    new Dictionary<string, string> {
        { "Foo", "The Foo" },
        { "Bar", "The Bar" },
    });

dataGrid.ItemsSource = (from item in someCollection
           select{
               Foo = item.SomeField,
               Bar = item.SomeOtherField,
           }).ToList();
dataGrid.SetValue(
DataGridUtilities.ColumnHeadersProperty,
新词典{
{“福”,“福”},
{“酒吧”,“酒吧”},
});
dataGrid.ItemsSource=(来自someCollection中的项
挑选{
Foo=item.SomeField,
Bar=item.SomeOtherField,
}).ToList();
那么您就有了以下附加的属性代码:

public static class DataGridUtilities
{
    public static IDictionary<string,string> GetColumnHeaders(
        DependencyObject obj)
    {
        return (IDictionary<string,string>)obj.GetValue(ColumnHeadersProperty);
    }

    public static void SetColumnHeaders(DependencyObject obj,
        IDictionary<string, string> value)
    {
        obj.SetValue(ColumnHeadersProperty, value);
    }

    public static readonly DependencyProperty ColumnHeadersProperty =
        DependencyProperty.RegisterAttached(
            "ColumnHeaders",
            typeof(IDictionary<string, string>),
            typeof(DataGrid),
            new UIPropertyMetadata(null, ColumnHeadersPropertyChanged));

    static void ColumnHeadersPropertyChanged(DependencyObject sender,
        DependencyPropertyChangedEventArgs e)
    {
        var dataGrid = sender as DataGrid;
        if (dataGrid != null && e.NewValue != null)
        {
            dataGrid.AutoGeneratingColumn += AddColumnHeaders;
        }
    }

    static void AddColumnHeaders(object sender,
        DataGridAutoGeneratingColumnEventArgs e)
    {
        var headers = GetColumnHeaders(sender as DataGrid);
        if (headers != null && headers.ContainsKey(e.PropertyName))
        {
            e.Column.Header = headers[e.PropertyName];
        }
    }
}
公共静态类DataGridUtilities
{
公共静态IDictionary GetColumnHeader(
从属对象(对象对象)
{
返回(IDictionary)对象GetValue(ColumnHeadersProperty);
}
公共静态void SetColumnHeaders(DependencyObject对象,
字典值)
{
对象设置值(ColumnHeadersProperty,value);
}
公共静态只读DependencyProperty ColumnHeadersProperty=
DependencyProperty.RegisterAttached(
“列标题”,
类型(IDictionary),
类型(数据网格),
新的UIPropertyMetadata(null,ColumnHeadersPropertyChanged));
静态无效ColumnHeadersPropertyChanged(DependencyObject发送器,
DependencyPropertyChangedEventArgs(附件e)
{
var dataGrid=发送方作为dataGrid;
if(dataGrid!=null&&e.NewValue!=null)
{
dataGrid.AutoGeneratingColumn+=AddColumnHeaders;
}
}
静态void AddColumnHeaders(对象发送方,
DataGrid自动生成ColumnEventArgs(e)
{
var headers=GetColumnHeaders(发送方为DataGrid);
if(headers!=null&&headers.ContainsKey(e.PropertyName))
{
e、 Column.Header=标题[e.PropertyName];
}
}
}

出于这个原因,我避免使用匿名类,只是创建了一个轻量级的数据对象。在你的情况下,它将是你已经发布的记录类。这里是否有使用匿名类的技术需要?“我无法创建具体类,原因有几个不同的内部原因”没有任何理由不能创建新类。你的磁盘空间用完了吗?这并不意味着粗鲁,但如果我的组织内部有人说我不能创建一个类,我会开始润色我的简历。嗯,其中一个主要原因是,我有大约70个这样的查询,我不想为每个查询创建一个类,只是为了使用
DisplayNameAttribute
。另一个原因是,有计划让用户在运行时选择列。@另一个原因听起来您可能需要对数据库进行一些规范化。即使您可以选择返回哪些列,DAO上也可以包含所有内容,未选择的内容将为空。我更好奇的是一个场景,用户选择所选的列是有意义的。谢谢你的回答。我已经在问题评论部分列出了我喜欢匿名类的主要原因。+1这可能是解决这个问题的一个好方法。我会尝试一下并发布反馈。谢谢