如何将孩子投射到父母和孩子的父母 [英] How can I cast child to parent and parent to child

查看:77
本文介绍了如何将孩子投射到父母和孩子的父母的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有这样的接口





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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆