gpt4 book ai didi

c# - 如何从另一个对象初始化一个对象

转载 作者:行者123 更新时间:2023-11-30 21:53:12 24 4
gpt4 key购买 nike

我已经有 15 年的编程经验,但我是 C# 的新手,对一般的强类型语言没有经验,所以如果这是一个 super 菜鸟问题,我深表歉意。

我试图避免相当多的重复代码,但在想出一种方法来做我想做的事情时遇到了麻烦。这是我目前拥有的示例:

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 个属性if/else 并且只有 2 或 3 个是唯一的)。我想做的是只用所有 sharedProperty 值初始化一个"template"模型,而在 if/else 内部只需要初始化 exclusiveProperty 值。

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

var template = new BaseModel
{
sharedProperty1 = 1,
sharedProperty2 = 2,
sharedProperty3 = 3,
sharedProperty4 = 4,
sharedProperty5 = 5,
sharedProperty6 = 6
};

dynamic finalModel;
if( conditionA )
{
finalModel = new ExtendedModelA{template};
finalModel.exclusivePropertyA = "foo";
}
else
{
finalModel = new ExtendedModelB{template};
finalModel.exclusivePropertyB = "foo";
}

我熟悉可用于接受"template"和“扩展”作为参数的工厂模式,但这与简单地保留我的重复一样多,所以我正在寻找一个更……直接?方法来做到这一点。

最佳答案

我认为无需重复代码即可执行此操作的最简单方法是在 if else block 中创建具有唯一属性的对象,然后在最后分配所有共享属性。这将避免您不得不重复代码。

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";
};

关于c# - 如何从另一个对象初始化一个对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34097986/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com