Member 13253943 Ответов: 2

Как я могу привести ребенка к родителю и родителя к ребенку


у меня есть такие интерфейсы


ICreateObjectData : IDictionaryConverter, IData

IDragAndDropObjectData : ICreateObjectData

Я создал список & lt;idraganddropobjectdata>, а также список & lt;idata>

Я хочу, чтобы список актеров&ЛТ;idata по> В список<idraganddropobjectdata&ГТ;

Что я уже пробовал:

В приведенном ниже коде я изменил входной параметр IDragAndDropObjectData к IData и хочу сохранить такое же исполнение в отношении IDragAndDropData как я могу этого достичь ?
private void DoActualDragAndDropOperation(List<idraganddropobjectdata> dataList)
        {
            foreach (IDragAndDropObjectData data in dataList)
            {
                UpdateComponentProperties(data);
            }
       }
            List<idraganddropobjectdata> nextDataList, toProcessDataList = new List<idraganddropobjectdata>(dataList);

2 Ответов

Рейтинг:
2

Tomas Takac

Если я правильно вас понял, вы хотите передать список IData, но вызываете UpdateComponentProperties только для элементов типа IDragAndDropObjectData. Вот несколько возможных подходов:

Фильтруйте по типу и забудьте обо всех остальных элементах:

private void DoActualDragAndDropOperation(List<IData> dataList)
{
    foreach (var data in dataList.OfType<IDragAndDropObjectData>())
    {
        UpdateComponentProperties(data);
    }
}


Если вы хотите выполнить действие с другими элементами, проверьте их один за другим:
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
        }
    }
}


Member 13253943

спасибо за решение это очень полезно

Рейтинг:
0

F-ES Sitecore

Вы можете перейти от IData к IDragAndDropObjectData только в том случае, если все объекты в списке реализуют 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;
}

}