我有一个来自本地库的类,我想转换为自己的类型,并且需要在几个地方进行。然后,我创建了一个静态方法,因此不需要在很多地方重复该类的实例化,但是在某种程度上,它似乎并不正确。
如果需要创建8种不同类型的转换,那么Record中将有8种不同的转换方法。
这是最好的方法吗?或者是否有涵盖该主题的已知模式?
class Record
{
public String Id { get; set; }
public String FirstName { get; set; }
public String LastName { get; set; }
public String FingerPrints { get; set; }
//
// This is a simplification of the method and in fact, I created several of
// them, and the class doesn't look clean anymore.
//
public static Record CreateFromMaciRecord(MaciRecord maci)
{
return new Record
{
Id = maci.GetRecordId(),
FirstName = Encoding.UTF8.GetString(maci.GetUserDataField("first_name")),
LastName = Encoding.UTF8.GetString(maci.GetUserDataField("name"))
};
}
}
答案 0 :(得分:2)
如果您不需要构造函数或静态工厂方法,则可以引入扩展方法。 EG
static class Conversions
{
public static Record ToRecord(this MaciRecord maci) => new Record
{
Id = maci.GetRecordId(),
FirstName = Encoding.UTF8.GetString(maci.GetUserDataField("first_name")),
LastName = Encoding.UTF8.GetString(maci.GetUserDataField("name"))
};
}
您会打电话给
var maciRecord = ...;
var record = maciRecord.ToRecord();
答案 1 :(得分:1)
您始终可以在Record
中提供隐式转换,只需执行以下操作即可:
Record record = someMaciRecord;
将此添加到Record
。
public static implicit operator Record(MaciRecord maci)
{
return new Record
{
Id = maci.GetRecordId(),
FirstName = Encoding.UTF8.GetString(maci.GetUserDataField("first_name")),
LastName = Encoding.UTF8.GetString(maci.GetUserDataField("name"))
};
}
答案 2 :(得分:1)
如果您的 Record 正在转换 MaciRecord 的接口以便与其余应用程序一起使用,那么我建议使用 Class或Object Adapter GOF设计模式< / em>。如果 Record 正在向 MaciRecord 添加新功能,则为 Decorator GOF设计模式提供机会。我们有必要通过 MaciRecord 请求包装器。这里要注意的是,这两种设计模式也称为<包装器>。