我需要一个小模式方向. C#的新手.
我正在使用包装Web服务的第三方开发工具包.我处理的两个特定类虽然相对类似,但是在devkit中有两个不同的命名空间,并且没有共同的基类.但是,我想为它们编写一个针对它们的通用接口.我随意地将一个基本上包装了包装器的实现组合在一起,但我觉得由于不断的类型转换,我认为它不是最有效的方法.
我一直在挖掘关于适配器,接口,扩展方法等的文章.但是我的运行时间很少,所以如果我能够在一个方向上推动,那将非常感激.
using ThirdParty.TypeA.Employee; using ThirdParty.TypeB.Employee; public class Employee { private object genericEmployee; private EmployeeType empType; public enum EmployeeType { TypeA = 0; TypeB = 1; } public Employee(Object employee,EmployeeType type) { genericEmployee = employee; empType = type; } public String Name { if (empType == EmployeeType.TypeA) return (ThirdParty.TypeA.Employee)genericEmployee.Name; else return (ThirdParty.TypeB.Employee)genericEmployee.Name; } public String Age { if (empType == EmployeeType.TypeA) return (ThirdParty.TypeA.Employee)genericEmployee.Age; else return (ThirdParty.TypeB.Employee)genericEmployee.Age; } }
第2版:
class EmployeeTypeAAdapter : TypeA,IEmployeeAdapter { TypeA _employee; public EmployeeTypeAAdapter(TypeA employee) { _employee = employee } public String Name { get { return _employee.Name; } set { _employee.Name = value; } } public String Balance { get { if (_employee.Balance != null) { decimal c = _employee.Balance.Amount; return String.Format("{0:C}",c); } else { return ""; } } } //... } class EmployeeTypeBAdapter : TypeB,IEmployeeAdapter { TypeB _employee; public EmployeeTypeAAdapter(TypeB employee) { _employee = employee } public String Name { get { return _employee.Name; } set { _employee.Name = value; } } public String Balance { get { if (_employee.Balance != null) { decimal c = _employee.Balance.Amount; return String.Format("{0:C}",c); } else { return ""; } } } //.... }
解决方法
试试这种方法:
public interface IEmployeeAdapter { string Age { get; set; } string Name { get; set; } } class EmployeeTypeAAdapter : TypeA,IEmployeeAdapter { public EmployeeTypeAAdapter(TypeA employee) { } } class EmployeeTypeBAdapter : TypeB,IEmployeeAdapter { public EmployeeTypeBAdapter(TypeB employee) { } } public static class EmployeeAdapterFactory { public static IEmployeeAdapter CreateAdapter(object employee,EmployeeType type) { switch (type) { case EmployeeType.TypeA: return new EmployeeTypeAAdapter((TypeA)employee); case EmployeeType.TypeB: return new EmployeeTypeBAdapter((TypeB)employee); } } // or without enum public static IEmployeeAdapter CreateAdapter(object employee) { if (employee is TypeA) return new EmployeeTypeAAdapter((TypeA)employee); if (employee is TypeB) return new EmployeeTypeABdapter((TypeB)employee); } // or better introduce sort of type map }
另一个专有名称是EmployeeProxy,如您所愿.