c# - inheritence + reflection - 如何不克隆对象

时间:2016-03-24 22:45:41

标签: c# inheritance reflection

我发现以下代码片段让我感到困惑。

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... 
}

我的主要问题是......为什么有人会想到这样做...... 这段代码可以带来什么好处。

1 个答案:

答案 0 :(得分:5)

它的作用:成员从a克隆到当前新创建的实例

优点:

  • 通过确保使用最大CPU周期来执行简单的操作来阻止CPU过冷
  • 它通过在一个简单的对象构造函数中进行大量分配来保持GC的脚趾,而没有任何像策略缓存这样的疯狂想法
  • 有点减少了必须编写手动“复制成员”代码的维护,但是:有一些工具可以非常好地和非常有效地使用它们;或者,如果这不是一个选项,那么仍有很多方法可以改进这些代码而不会让它变得非常复杂