减少构造函数锅炉板代码

Joe*_*oeS 6 c#

我经常最后写这样的课程:

public class Animal
{
    public string Colour { get; set; }
    public int Weight { get; set; }

    public Animal(Dog data)
    {
        this.Colour = data.Colour;
        this.Weight = data.Weight;
    }

    public Animal(Cat data)
    {
        this.Colour = data.Colour;
        this.Weight = data.Weight;
    }
}
Run Code Online (Sandbox Code Playgroud)

当你有很多属性和类型时,你很快就会得到很多锅炉板代码.理想情况下,在这种情况下,我只需创建一个IAnimal接口并引用它.我目前处于第三方程序集中存在Dog和Cat类的情况,我无法修改它们.我能想出的唯一解决方案是:

public class Animal
{
    public string Colour { get; set; }
    public int Weight { get; set; }

    public Animal(Cat data){Init(data);}
    public Animal(Dog data){Init(data);}

    private void Init(dynamic data)
    {
        this.Colour = data.Colour;
        this.Weight = data.Weight;
    }
}
Run Code Online (Sandbox Code Playgroud)

这有效,但我失去了所有类型的安全性,是否有比构造函数注入更好的解决方案?

谢谢,

编辑:这是一个现实世界的例子.我有一个第三方库,它返回3个对象:

  • GetPageByIdResult
  • GetPagesByParentIdResult
  • GetPagesByDateResult

(这些都是来自服务引用的自动生成的类,并且属性非常相似)

我不想处理这三个对象,而是处理单个PageData对象或它们的集合.

Jam*_*ley 4

您可以将逻辑放在所有其他构造函数调用的一个公共构造函数中:

public class Animal
{
    public string Colour { get; set; }
    public int Weight { get; set; }

    public Animal(Dog data) : this (data.Colour, data.Weight)
    {
    }

    public Animal(Cat data) : this (data.Colour, data.Weight)
    {
    }

    private Animal(string colour, int weight)
    {
        this.Colour = colour;
        this.Weight = weight;
    }
}
Run Code Online (Sandbox Code Playgroud)

这与您的第二个解决方案非常相似,但它不会失去类型安全性。