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 に答える