如何将孩子投射到父母和孩子的父母 [英] How can I cast child to parent and parent to child
问题描述
我有这样的接口
i have interfaces like this
ICreateObjectData : IDictionaryConverter, IData
IDragAndDropObjectData : ICreateObjectData
我创建了List< idraganddropobjectdata>以及List< idata>
我想要演员名单< idata> to list< idraganddropobjectdata>
我尝试过:
In在代码下面,我将输入参数 IDragAndDropObjectData
更改为 IData
,并希望保持相对于 IDragAndDropData的相同执行
我该如何实现?
I have created the List<idraganddropobjectdata> as well as List<idata>
I want cast List<idata> to List<idraganddropobjectdata>
What I have tried:
In Below code I changed input parameter IDragAndDropObjectData
to IData
and wanna maintain same execution with respect to IDragAndDropData
how Can I achieve this ?
private void DoActualDragAndDropOperation(List<idraganddropobjectdata> dataList)
{
foreach (IDragAndDropObjectData data in dataList)
{
UpdateComponentProperties(data);
}
}
List<idraganddropobjectdata> nextDataList, toProcessDataList = new List<idraganddropobjectdata>(dataList);
推荐答案
如果我理解正确,您希望传入IData列表,但只为IDragAndDropObjectData类型的项调用UpdateComponentProperties。以下是一些可能的方法:
按类型筛选并忘记所有其他项目:
If I understand you correctly you want to pass in a list of IData but only call UpdateComponentProperties for items of type IDragAndDropObjectData. Here are some possible approaches:
Filter by type and forget about all the other items:
private void DoActualDragAndDropOperation(List<IData> dataList)
{
foreach (var data in dataList.OfType<IDragAndDropObjectData>())
{
UpdateComponentProperties(data);
}
}
如果您想对其他项目执行操作,请逐一检查:
If you want to perform action on the other items, check them one by one:
private void DoActualDragAndDropOperation(List<IData> dataList)
{
foreach (var data in dataList)
{
var dragAndDropData = data as IDragAndDropObjectData;
if (dragAndDropData != null)
{
UpdateComponentProperties(dragAndDropData);
}
else
{
// do something else, e.g. log a warning
}
}
}
您只能从IData向上转换为IDragAndDropObjectData如果列表中的所有对象都实现了IDragAndDropObjectData。
You can only up-cast from IData to IDragAndDropObjectData if all objects in the list implement IDragAndDropObjectData.
List<IData> dataList = new List<IData> { };
// add three classes that implemenet IDragAndDropObjectData
dataList.Add(new DragAndDropObjectData { ID = 1 });
dataList.Add(new DragAndDropObjectData { ID = 2 });
dataList.Add(new DragAndDropObjectData { ID = 3 });
// create a List<IDragAndDropObjectData> from List<IData>
// it is possible to "up cast" IData to IDragAndDropObjectData because the objects all
// implement IDragAndDropObjectData
List<IDragAndDropObjectData> ddData = new List<IDragAndDropObjectData>(dataList.Cast<IDragAndDropObjectData>());
foreach(IDragAndDropObjectData d in ddData)
{
int id = d.ID;
}
dataList = new List<IData> { };
// add two classes that implemenet IDragAndDropObjectData and one that implements ICreateObjectData
dataList.Add(new DragAndDropObjectData { ID = 1 });
dataList.Add(new DragAndDropObjectData { ID = 2 });
dataList.Add(new CreateObjectData { ID = 3 });
// The above is legal as dataList can contain anything that implements IData
// This line will throw a run-time error as it can't cast the last object to IDragAndDropObjectData
ddData = new List<IDragAndDropObjectData>(dataList.Cast<IDragAndDropObjectData>());
// code never gets here
foreach (IDragAndDropObjectData d in ddData)
{
int id = d.ID;
}
如果您不能保证清单内容
>
List<IData> dataList = new List<IData> { };
// add three classes that implemenet IDragAndDropObjectData
dataList.Add(new DragAndDropObjectData { ID = 1 });
dataList.Add(new DragAndDropObjectData { ID = 2 });
dataList.Add(new DragAndDropObjectData { ID = 3 });
// create a List<IDragAndDropObjectData> from List<IData>
// it is possible to "up cast" IData to IDragAndDropObjectData because the objects all
// implement IDragAndDropObjectData
List<IDragAndDropObjectData> ddData = new List<IDragAndDropObjectData>(dataList.Cast<IDragAndDropObjectData>());
foreach(IDragAndDropObjectData d in ddData)
{
int id = d.ID;
}
dataList = new List<IData> { };
// add two classes that implemenet IDragAndDropObjectData and one that implements ICreateObjectData
dataList.Add(new DragAndDropObjectData { ID = 1 });
dataList.Add(new DragAndDropObjectData { ID = 2 });
dataList.Add(new CreateObjectData { ID = 3 });
// The above is legal as dataList can contain anything that implements IData
// We'll cast the objects ourselves first checking if they implement IDragAndDropObjectData. If they do
// we cast else we use null
ddData = new List<IDragAndDropObjectData>(dataList.Select(d => d is IDragAndDropObjectData ? (IDragAndDropObjectData)d : null));
// now ddData contains two objects and one null reference so filter out the null in the foreach
foreach (IDragAndDropObjectData d in ddData.Where(x => x != null))
{
int id = d.ID;
}
}
这篇关于如何将孩子投射到父母和孩子的父母的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!