Может ли C # сделать мой класс похожим на другой класс? - PullRequest
1 голос
/ 24 марта 2010

У меня есть класс, который выглядит так:

public class BasePadWI
{
    public WorkItem WorkItemReference { get; set; }
    .... Other stuff ......
}

У меня есть словарь, который определен так:

public Dictionary<BasePadWI, Canvas> Pad { get; set; }

Затем я хотел бы позвонить так:

List<WorkItem> workItems = Pad.Keys.ToList();

(Примечание: WorkItem - это запечатанный класс, поэтому я не могу наследовать.)

Есть ли какая-нибудь хитрость, которую я мог бы сделать в классе, чтобы он выглядел как WorkItem?

Тем временем я сделал это:

List<WorkItem> workItems = Pad.Keys.ToList().ConvertAll(x=>x.WorkItemReference );

Ответы [ 4 ]

9 голосов
/ 24 марта 2010

Вы можете сделать:

List<WorkItem> workItems = Pad
                             .Keys
                             .Select(basePad => basePad.WorkItemReference)
                             .ToList();

Это использует LINQ для извлечения вашего члена на лету.

3 голосов
/ 24 марта 2010

Вы можете переопределить оператор приведения к

public class BasePadWI
{
    protected WorkItem _workItemReference;
    public WorkItem WorkItemReference { get { return _workItemReference; }}


    public static implicit operator WorkItemReference(BasePadWI item)
    {
       return item._workItemReference;
     }
    .... Other stuff ......
}

Это может вводить в заблуждение, поскольку вы на самом деле не преобразуете BasePadWI в WorkItem, но это должно позволить вам легко создавать нужные списки.

Всякий раз, когда вы делаете что-то вроде следующего:

BasePadWI bpw = new BasePadWI();

WorkItem item = bpw;

bpw должен быть неявно преобразован в WorkItem, который благодаря объявленному оператору возвращает ссылку на внутренний WorkItem _pworkItemReference bpw.

Вы также можете использовать это, скажем, для приведения соединений с базой данных к целым числам, поэтому будьте осторожны, чтобы не сделать ваш код слишком сложным для интерпретации беднягой, который собирается его поддержать позже.

2 голосов
/ 24 марта 2010

Возможно переопределение оператора приведения. Я вижу, что Дэвид только что опубликовал то же самое. Вот образец.

   class Program
   {
      static void Main(string[] args)
      {
         Foo foo = new Foo();
         BasePadWI bp = (BasePadWI)foo;
         Console.WriteLine(bp.name);
      }
   }

   class BasePadWI {
      public string name = "BasePadWI";
   }

   class Foo
   {
      BasePadWI basePadWI = new BasePadWI();

      public static implicit operator BasePadWI(Foo foo)
      {
         System.Console.WriteLine("Converted Foo to BasePadWI");
         return foo.basePadWI;
      }
   }
2 голосов
/ 24 марта 2010

Нет. BasePadWI не является рабочим элементом. Если вы хотите воспользоваться преимуществами наследования, то вам нужно использовать наследование. В вашем случае вам нужно заставить BasePadWI наследовать от WorkItem. ConvertAll почти так же хорош, как вы можете, не открывая WorkItem.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...