2010-03-23 27 views
1

我有一个类,看起来像这样:再有这样定义字典C#能否让我的课程看起来像另一个课程?

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

回答

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到工作项目,但它应该让你建立你想很容易的名单。

当你这样做的以下内容:

BasePadWI bpw = new BasePadWI(); 

WorkItem item = bpw; 

BPW应隐式转换为一个工作项目,其中,由于我们已经声明了操作,返回到BPW的内部工作项目_workItemReference参考。

你也可以用它来将数据库连接转换为整数,所以要注意不要让你的代码太难以被可怜的schmuck解释,谁将在稍后保留这个连接。

+0

+1:很好的答案。 – codenheim 2010-03-23 22:30:27

+0

虽然这并不是我想要的(它不适用于列表),但它是最接近的。谢谢戴夫! – Vaccano 2010-03-23 22:36:17

9

你可以这样做:

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

这使用LINQ把解压出来的飞行您的会员。

+0

这与转换选项类似,但更好,因为我不必在转换之前执行ToList。不是我想要的,但是谢谢。 – Vaccano 2010-03-23 22:38:08

2

不。一个BasePadWI不是一个WorkItem。如果你想要继承的好处,那么你需要使用继承。在你的情况下,你需要让BasePadWI继承自WorkItem。 ConvertAll与您在不解封WorkItem的情况下可以做的一样好。

2

覆盖演员操作符是可能的。我看到大卫刚刚发布了相同的内容。这是一个示例。

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

伟大的思想。 =)+1 – 2010-03-23 21:56:42

+0

+1的好东西。戴夫得到了第一个答案。 – Vaccano 2010-03-23 22:36:53