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

Ale*_*ker 2 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;
        }
    }
Run Code Online (Sandbox Code Playgroud)

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

但这使问题悬而未决:这怎么可能?

Ada*_*rth 5

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

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

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

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

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

就个人而言,我仍然会删除这个代替更强大的代码,而不是假设属性名称总是相同的.