2016-03-24 6 views
-2

私は困惑した次のコードスニペットを見つけました。c# - 継承+リフレクション - オブジェクトをクローン化しない方法

public class Bclass : Aclass 
{ 
    public const BindingFlags Flags = BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance; 

    public Bclass(IAclass a) : base(string.Empty) 
    { 
     var destFields = this.GetType().BaseType.GetFields(Flags); 

     a.GetType().GetFields(Flags).Where(x => destFields.Contains(x)).ToList().ForEach(property => 
     { 
      destFields.First(x => x == property).SetValue(this, property.GetValue(a)); 
     }); 

     var destProperties = this.GetType().BaseType.GetProperties(Flags); 

     a.GetType().GetProperties(Flags).Where(x => destProperties.Contains(x)).ToList().ForEach(property => 
     { 
      destProperties.First(x => x == property).SetValue(this, property.GetValue(a, null)); 
     }); 
    } 
    // some more methods... 
} 

私の主なQは、なぜ誰もがそれを行うの思うだろう....です... 何の利益(単数または複数)は、このコードから出てくることができます。それは何

+2

本当に本当に*悪いことに、aから新しいインスタンス。それはひどく見え、非常に非効率的です –

+0

Protip:AutoMapperを使用してください。 – leppie

+0

誰が何をやろうと考えているのですか?フィールドはコピーされますか?一般的にこのひどいコードですか?私の意見では、反映は通常、コンストラクタの悪い呼び出しです。あなたは利益について質問しますが、何に対してですか?あなたがこれから何をしたいのかを明確にしてください。 –

答えて

5

:現在、新しく作成されたインスタンスにaからmemberwiseクローン

利点:

  • それは必ずそれが何かをする最大CPUサイクルを使用することによって、あまりにも冷えからあなたのCPUを停止します
  • シンプルなオブジェクトコンストラクタで、ストラテジキャッシュのような狂ったアイデアなしに大量の割り当てを行うことで、GCをそのまま維持します。
  • ki ndaは、手動の "メンバーのコピー"コードを書かなければならないメンテナンスを減らしますが、それを非常にうまく効率よく実行するツールがあります。もしそれがオプションでないならば、このコードを精巧に複雑にすることなくこのコードを改善する方法はまだまだたくさんあります。
+0

そしてここでBのインスタンス化によってオブジェクト 'a'のプライベートデータが公開されますか? – davidhadas

+0

@davidhadasのため、リフレクションAPIがカバーの後ろでピークに達するように指示する 'BindingFlags.NonPublic'のため –

+0

しかしこれはベースクラスでこれをやっているので.....あなたはプライベートデータにアクセスすることはできません私が読んだものそうでなければ、C# – davidhadas

関連する問題