Click here to Skip to main content
15,892,809 members
Please Sign up or sign in to vote.
0.00/5 (No votes)
See more:
i have interfaces like this


C#
ICreateObjectData : IDictionaryConverter, IData

IDragAndDropObjectData : ICreateObjectData

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 ?
C#
private void DoActualDragAndDropOperation(List<idraganddropobjectdata> dataList)
        {
            foreach (IDragAndDropObjectData data in dataList)
            {
                UpdateComponentProperties(data);
            }
       }
            List<idraganddropobjectdata> nextDataList, toProcessDataList = new List<idraganddropobjectdata>(dataList);
Posted
Updated 8-Aug-17 22:53pm
v2

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:
C#
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:
C#
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
        }
    }
}
 
Share this answer
 
Comments
Member 13253943 9-Aug-17 4:32am    
thanks for the solution it is very helpful
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;
}


If you can't guarantee the contents of the list

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

}
 
Share this answer
 

This content, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)



CodeProject, 20 Bay Street, 11th Floor Toronto, Ontario, Canada M5J 2N8 +1 (416) 849-8900