为什么在匿名类型上检索属性名称会产生以下结果?

时间:2012-05-23 10:09:40

标签: c# reflection

我的一名初级同事设法编写了非常可怕,可怕的代码。

printJob.Type = item[LocalFunctions.GetName(new { printJob.Type })].ToString();

 public static string GetName<T>(T item) where T : class
    {
        try
        {
            return typeof(T).GetProperties()[0].Name;
        }
        catch (Exception ex)
        {
            return null;
        }
    }

你有什么想法GetName将输出什么? 输出“Type”! 我只是不明白这是怎么回事。我的第一个想法是MS将创建一个匿名类型,其属性与值来自的属性同名(编译魔术?)。由于这不可能是一个受支持的功能,我建议我的初级同事不要使用他无法理解的东西。

但是问题仍未解决:这怎么可能?

2 个答案:

答案 0 :(得分:5)

匿名类型推断属性名称,除非指定它们:

  

如果未在匿名类型中指定成员名称,则为编译器   为匿名类型成员提供与属性相同的名称   用来初始化它们。

http://msdn.microsoft.com/en-us/library/bb397696.aspx

编译器然后在编译时推断泛型的类型 - 因此typeof(T)起作用。它完全受支持,即使代码很脆弱。当有人重构财产的名称时会发生什么?

我还说,不建议人们就你自己没有答案的话题提供建议 - 这是很多www.thedailywtf.com文章的来源; - )

就我个人而言,我仍然会删除它,而不是假设属性名称总是相同的。

答案 1 :(得分:1)

这就是编译器(而不是MS)在创建匿名类型时所做的事情。它使用提供的参数的类型,名称和顺序来构造新类型。这完全支持并且打算这样,所以没有理由不使用它。

编译器具有可用于执行此操作的所有信息。它会查看用于初始化的属性的名称和类型(例如printJob.Type),并可以使用该信息为您生成匿名类型。

有关更多信息,请参见此处:
http://msdn.microsoft.com/en-us/library/bb397696.aspx