Какое элегантное решение получить значения свойств из двух классов (с одинаковыми именами свойств), которые не используют наследование? - PullRequest
2 голосов
/ 07 мая 2010

По сути, я должен использовать плохо реализованный веб-сервис, поддерживаемый другими программистами. У них есть два класса, которые не являются производными от родительского класса, но имеют одинаковые свойства (Ughh ...). Вот так это выглядит в моем файле класса прокси веб-сервиса:

public partial class Product1
{
    public int Quantity;
    public int Price;
}

public partial class Product2
{
    public int Quantity;
    public int Price;
}

Так, каков наилучший способ получить значения из известных свойств без дублирования кода? Я знаю, что, вероятно, мог бы использовать отражение, но это может быть ужасно. Если есть более простой и менее безумный способ сделать это (возможно, в новых функциях c #?), Пожалуйста, дайте мне знать.

Ответы [ 4 ]

3 голосов
/ 07 мая 2010

Я не уверен, что полностью понимаю вашу ситуацию, но может быть что-то подобное? Определите интерфейс IProduct с методами getQuantity и getPrice и реализуйте его в обоих классах:

public partial class Product1 : IProduct
{
  public int Quantity;
  public int Price;
  public int getQuantity() { return Quantity; }
  public int getPrice() { return Price; }
}

И аналогично для другого; тогда просто используйте их обоих как IProduct.

2 голосов
/ 07 мая 2010

Если классы генерируются из веб-прокси, вы можете реализовать частичный класс, который реализует общий интерфейс.

Из прокси Gen:

public partial class Product1 {
    public int Quantity;
    public int Price;
}

public partial class Product2 {
    public int Quantity;
    public int Price;
}

Рукописно:

public interface IProduct {
    int Quantity { get; }
    int Price { get; }
}

public partial class Product1:IProduct {
    int IProduct.Quantity { get { return Quantity; } }
    int IProduct.Price { get { return Price; } }
}

public partial class Product2:IProduct {
    int IProduct.Quantity { get { return Quantity; } }
    int IProduct.Price { get { return Price; } }
}

Теперь оба ваших класса реализуют IProduct и могут передаваться одинаково.

1 голос
/ 07 мая 2010

Динамическое ключевое слово в 4.0? но я бы не сказал, что это элегантно, но это сработает.

0 голосов
/ 07 мая 2010

вот какой-то псевдокод, извините, что не сработал. Может быть, это дает вам правильное направление:

Объекты списка = новый список (); objects.Add (p1); // ваш первый объект продукта objects.Add (p2); // ваш второй объект продукта

    foreach (var o in objects)//go through all projects
    {

        if (o.GetType().Equals(typeof(Product1)) //check which class is behind the object
            ((Product1)o).Price = 2; //convert to fitting class and call your property
        //....
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...