在我工作的公司里,我被迫使用来自我无法访问的第三方API的设计糟糕的模型:
class Player
{
object Id;
object Name;
}
每次我使用这些属性时,我都必须将它们转换为特定类型。
var name = player.Name.ToString();
var id = (int)player.Id;
我必须在数据库中查找类型是什么。
我正在考虑创建完全相同的类,并使用类似AutoMapper的东西每次将它映射到我自己的类型,并创建一些代理/包装类而不是原始类。
任何解决方案?
答案 0 :(得分:2)
There are two ways I would do this. Either using an extension method or by simply creating your new class with a static Convert method that take the badly designed class as a parameter.
Example 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; }
}
}
Example 2: using Extension Methods
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();
}
}
}
答案 1 :(得分:1)
您可以做的一件事是为您关注的属性创建extension method。好处是前期工作量较少:只需在发现自己需要进行强制转换时创建扩展方法。您不必编写任何完整的类或映射代码。缺点是每次需要强类型属性时都必须调用方法。
例如:
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();
答案 2 :(得分:1)
我曾为这样的公司工作过。如果你知道.Net,那么他们仍然会在面试中问你,而你发现他们的意思是他们需要维护的旧版Server 2003上的版本1.1。他们是Raisin Bran的烧焦葡萄干。
使用继承来重新定义craptastic模型。这就是我通常如何解决它。然后,我从我的对象返回我想要的东西,并停止使用我基于它的类。
前:
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
的新对象,但继承该对象并覆盖其属性可能是更好的选择。