在我工作的公司里,我被迫使用来自第三方API的设计不佳的模型,
我无法访问:class Player
{
object Id;
object Name;
}
每次使用这些属性时,我都必须将它们强制转换为特定类型。
var name = player.Name.ToString();
var id = (int)player.Id;
我必须查找数据库的类型是什么。
我正在考虑创建完全相同的类,并使用类似AutoMapper的东西每次将其映射到我自己的类型,并在原始类上创建一些代理/包装器类。
有什么解决办法吗?
我有两种方法可以做到这一点。使用扩展方法,或者简单地使用静态 Convert 方法创建新类,该方法将设计不佳的类作为参数。
示例 1:
namespace ExcellentDesignedClasses
{
public class NewPlayerClass
{
public NewPlayerClass(int id, string name)
{
Id = id;
Name = name;
}
public static NewPlayerClass Convert(Player player)
{
return new NewPlayerClass((int)player.Id, (string)player.Name);
}
public int Id { get; set; }
public string Name { get; set; }
}
}
示例 2:使用扩展方法
namespace ExcellentDesignedClasses
{
public class NewPlayerClass
{
public NewPlayerClass(int id, string name)
{
Id = id;
Name = name;
}
public int Id { get; set; }
public string Name { get; set; }
}
}
namespace ExcellentDesignedClasses.Extensions
{
public static class Extensions
{
public static NewPlayerClass ConvertToNew(this Player player)
{
return new NewPlayerClass((int)player.Id, (string)player.Name);
}
}
}
namespace MyProgram
{
using ExcellentDesignedClasses.Extensions;
public class Main
{
public void DoSomething()
{
var oldClassStructure = new Player();
var newClassStructure = oldClassStructure.ConvertToNew();
}
}
}
您可以做的一件事是为您关心的属性创建一个扩展方法。好处是它减少了前期工作:当您发现自己需要进行转换时,只需创建一个扩展方法。您不必编写任何完整的类或映射代码。缺点是每次需要强类型属性时都必须调用方法。
例如:
namespace ExtensionMethods
{
public static class MyExtensions
{
public static string GetName(this Player p)
{
return p.Name?.ToString();
}
public static int GetId(this Player p)
{
return Convert.ToInt32(p.Id);
}
}
}
然后,您的代码将如下所示:
string name = player.GetName();
int id = player.GetId();
我曾在这样的公司工作过。 他们是那种在面试中仍然问你是否知道.Net的人,你发现他们的意思是他们需要维护的Server 2003旧实例上的1.1版本。 它们是葡萄干麸皮中烧焦的葡萄干。
使用继承来重新定义废话模型。 这就是我通常修复它的方式。 然后,我从对象中返回我想要的内容,并停止使用我基于它们的类。
前任:
class Player
{
public object Id;
public object Name;
}
class UserPlayer : Player
{
public new int Id
{
get
{
return Convert.ToInt32(base.Id);
}
set
{
base.Id = value;
}
}
public new string Name
{
get
{
return base.Name.ToString();
}
set
{
base.Name = value;
}
}
}
在做上述事情时,一个亚军的想法会给你带来麻烦,因为编写代码的人仍然为公司工作,有朋友,或者更糟的是,是你的老板:使用静态类来处理你想要的东西。
public static class ProcessPlayers
{
public static int ID(Player p)
{
return Convert.ToInt32(p.Id);
}
public static string Name(Player p)
{
return p.Name.ToString();
}
}
您还可以通过将Player
作为属性来创建新对象,每个对象都环绕Player
,但继承对象并重写其属性可能是更好的选择。