如何从另一个对象初始化对象

时间:2015-12-04 21:44:39

标签: c# c#-4.0

我已经编程了15年,但我是C#的新手,对一般的强类型语言缺乏经验,所以如果这是一个超级菜鸟问题我会道歉。

我试图避免相当多的重复代码,并且无法找到一种方法来做我想做的事情。这是我目前所拥有的一个例子:

class BaseModel {
    string sharedProperty1;
    string sharedProperty2;
    string sharedProperty3;
    string sharedProperty4;
    string sharedProperty5;
    string sharedProperty6;
}

class ExtendedModelA : BaseModel {
    string exclusivePropertyA;
}

class ExtendedModelB : BaseModel {
    string exclusivePropertyB;
}

// --------

dynamic finalModel;
if( conditionA )
{
    finalModel = new ExtendedModelA{
        sharedProperty1 = 1,
        sharedProperty2 = 2,
        sharedProperty3 = 3,
        sharedProperty4 = 4,
        sharedProperty5 = 5,
        sharedProperty6 = 6,
        exclusivePropertyA = "foo"
    };
}
else
{
    finalModel = new ExtendedModelB{
        sharedProperty1 = 1,
        sharedProperty2 = 2,
        sharedProperty3 = 3,
        sharedProperty4 = 4,
        sharedProperty5 = 5,
        sharedProperty6 = 6,
        exclusivePropertyB = "bar"
    };
}

正如您所看到的,存在大量冗余,因为初始化值的唯一差异是每个上的exclusiveProperty(在我的特定情况下,我在{的每一半中有大约30个属性重复{ {1}}并且只有2或3个唯一的)。我想做的是初始化一个"模板"使用所有if/else值只模拟一次,而sharedProperty内只需要初始化if/else值。

这里有一些伪代码来说明我想做的事情的概念,但我还没有能够让它发挥作用。

exclusiveProperty

我熟悉可以用来接受"模板"的工厂模式。和#34;扩展"作为参数,但这就像简单地保留我的重复一样多的代码,所以我正在寻找更直接的东西?这样做的方法。

2 个答案:

答案 0 :(得分:2)

我认为在不重复代码的情况下,最简单的方法是在if else块中创建具有唯一属性的对象,然后在最后分配所有共享属性。这样可以防止您不得不重复代码。

BaseModel finalModel = null;
if (conditionA)
{
    finalModel = new ExtendedModelA()
                     {
                         exclusivePropertyA = "some value";
                     };
}
else
{
    finalModel = new ExtendedModelB()
                     {
                         exclusivePropertyB = "some other value";
                     };
}
finalModel.sharedProperty1 = "asdf";
// assign the rest of the values

您还可以拥有基础模型的构造函数,该构型函数将基础模型作为参数并将所有值分配给新对象。这基本上是使用原始模板来创建新的。然后,您可以使用模板创建扩展类,并将其传递给基础构造函数。

    class BaseModel
    {
        public string sharedProperty1 { get; set; }
        public string sharedProperty2 { get; set; }
        public string sharedProperty3 { get; set; }
        public string sharedProperty4 { get; set; }
        public string sharedProperty5 { get; set; }
        public string sharedProperty6 { get; set; }

        public BaseModel(BaseModel t)
        {
            //assign template properties 
        }

        public BaseModel()
        {

        }
    }


    class ExtendedModelA : BaseModel
    {
        public string exclusivePropertyA { get; set; }

        public ExtendedModelA(BaseModel t)
            : base(t)
        {

        }
    }

    class ExtendedModelB : BaseModel
    {
        public string exclusivePropertyB { get; set; }

        public ExtendedModelB(BaseModel t)
            : base(t)
        {

        }
    }

然后使用它将是

BaseModel template = new BaseModel()
                         {
                             //assign values
                         };

ExtendedModelA = new ExtendedModelA(template)
                     {
                         exlusivePropertyA = "asdf";
                     };

答案 1 :(得分:1)

你的第二次尝试几乎是正确的。您只需要将BaseModel ctor添加到ExtendedModelA& ExtendedModelB

class ExtendedModelA : BaseModel
{
    public ExtendedModelA(BaseModel b)
        : base(b)
    {
    }
}

然后这样称呼:

BaseModel template = new BaseModel
{
    // init code
};

finalModel = new ExtendedModelA(template); // note the parenthesis's not curly braces