【问题标题】:Elegantly handling different classes with same properties in 3rd party library优雅地处理 3rd 方库中具有相同属性的不同类
【发布时间】:2015-09-10 05:00:53
【问题描述】:

我的 c# 应用程序使用第三方库,该库具有多个不共享接口或基类的类,但具有多个共同的属性(这些属性可能具有或可能不具有相同的名称,但它们本质上存储相同信息)。举个简单的例子:

class A
{
   int Prop1;
   string Prop2;
}

class B
{
   int Prop1;
   string Prop2b;
}

注意 Prop1 的两个类名称相同,但 Prop2 和 Prop2b 的名称不同(尽管它们在语义上相同)。

在一个实例中,类实际上是结构。

这导致我这边有很多重复的代码来对每个类做同样的事情(只是另一个简单的例子:将 Prop1 附加到 Prop2 或 Prop2b)。有什么优雅的方式来处理这个问题?

【问题讨论】:

  • 您可以尝试使用dynamic,但您的问题还不够清楚,无法多说。
  • 它们是部分类吗?
  • @Marcin:有趣的想法,但由于属性名称有时略有不同(Prop2 与 Prop2b),因此不太可行。
  • @Shoe:不,它们不是部分类。

标签: c#


【解决方案1】:

例如,您可以编写从接口派生的适配器

第三方课程

class Car
{
   int CarId;
   string CarName;
}

class Motorcycle
{
   int MotoId;
   string MotoName;
}

你的界面

public interface IVehicle
{
   int Id;
   string Name;
}

还有你的课

class MyCar : IVehicle
{
   private Car _car;
   public MyCar (Car car){ _car = car }
   int Id; // returns _car.CarId
   string Name; // returns _car.CarName
}

class MyMotorcycle : IVehicle
{
   private Motorcycle _moto;
   public MyCar (Motorcycle moto){ _moto = moto; }
   int Id; // returns _moto.MotoId
   string Name; // returns _moto.MotoName
}

现在您可以使用接口了。

【讨论】:

    【解决方案2】:

    您可以创建一个接口,然后为每种类型创建一个适配器以使其适应该接口。如果有足够多的类来保证额外的复杂性,您可以使用 Castle.DynamicProxy 动态创建实现。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-01-06
      • 1970-01-01
      • 2013-08-14
      • 2015-10-23
      • 1970-01-01
      • 1970-01-01
      • 2013-03-28
      • 1970-01-01
      相关资源
      最近更新 更多