我有一个看起来像这样的课程:
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 );
答案 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;
}
}