我有一个来自本机库的类,我想转换为我自己的类型,我需要在几个地方做到这一点。然后,我创建了一个静态方法,所以我不需要在很多地方重复类的实例化,但不知何故,它似乎不正确。
如果需要从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"))
};
}
}
如果您不想要构造函数或静态工厂方法,可以引入扩展方法。例如
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();
您可以始终在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"))
};
}
如果您的Record正在转换MaciRecord的接口以便与应用程序的其他部分一起工作,那么我建议您使用class或Object Adapter GOF设计模式。如果Record正在为MaciRecord添加新功能,那么这是Decorator GOF设计模式的机会。我们必然要求包装器覆盖MaciRecord。这里需要注意的是,这两种设计模式也被称为Wrapper。