C#可以让我的课看起来像另一个班吗?

时间:2010-03-23 21:41:41

标签: c# class c#-3.0

我有一个看起来像这样的课程:

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 个答案:

答案 0 :(得分:9)

你可以这样做:

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

这使用LINQ来动态提取您的成员。

答案 1 :(得分:3)

您可以覆盖

的强制转换运算符
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,由于我们声明的运算符,它返回对bpw的内部WorkItem _workItemReference的引用。

你也可以使用它来表示,例如,将数据库连接转换为整数,所以要小心你不要让你的代码太难以被那些稍后将要保留它的穷人schmuck解释。

答案 2 :(得分:2)

没有。 BasePadWI不是WorkItem。如果您想要继承的好处,那么您需要使用继承。在您的情况下,您需要使BasePadWI继承自WorkItem。如果不启封WorkItem,ConvertAll就可以做到最好。

答案 3 :(得分:2)

可以覆盖演员。我看到David刚刚发布了同样的帖子。这是一个样本。

   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;
      }
   }