2

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

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

但这留下了一个问题:这怎么可能?

4

2 回答 2

5

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

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

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

然后编译器在编译时推断泛型的类型 - 这样就typeof(T)可以了。完全支持它,即使代码很脆弱。当有人重构属性名称时会发生什么?

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

就个人而言,我仍然会删除它以支持更健壮的代码,而不是假设属性名称总是相同的。

于 2012-05-23T10:12:59.273 回答
1

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

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

请参阅此处了解更多信息:http:
//msdn.microsoft.com/en-us/library/bb397696.aspx

于 2012-05-23T10:13:22.553 回答