Solved

clone of an inherited generic list

Posted on 2010-08-27
5
725 Views
Last Modified: 2013-11-08
I have a class "NavigationElement", where I implemented a clone method.

Then I have a generic List that inherits from a list of this objects (NavigationElement)

public class NavigationElementsList<NavigationElement> : List<NavigationElement>, ICloneable
...
in this list I also implemented the
   public Object Clone()
        {
            return this.MemberwiseClone();
        }

now I need to call the FindAll method in an istance of this NavigationElementsList<NavigationElement>, but this is not possible because the returned type is not the same as the generic List<T>.
I need to have a deep copy of the list because I'm going to change the values of the properties and this will cause a change in the referenced items in  the original list<T> that I want to avoid.

This also won't work:
 public NavigationElementsList<T> FindAll(Predicate<T> match)
        {
            return base.FindAll(match);
        }

Any suggestions?
0
Comment
Question by:LorenzoB
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
  • 3
5 Comments
 

Author Comment

by:LorenzoB
ID: 33543064
Actually resolved in this way (maybe useful for some other).
 public NavigationElementsList<NavigationElement> FindAll(Predicate<NavigationElement> match)
        {
            NavigationElementsList<NavigationElement> navCopyOfList = new NavigationElementsList<NavigationElement>();
            navCopyOfList.AddRange(base.FindAll(match));
            return navCopyOfList;
        }
0
 
LVL 30

Expert Comment

by:MlandaT
ID: 33543074
0
 

Author Comment

by:LorenzoB
ID: 33543110
The problem is in the FindAll method and the type that it returns.
Thank you anyway
0
 
LVL 8

Accepted Solution

by:
Gururaj Badam earned 500 total points
ID: 33579507
In the first place why do you want to inherit from List<T>. I suggest you to write an extension method instead to add your clone method

say like

public T Clone<T>(this List<T> _list)
        {
            return _list.MemberwiseClone(); // Or something like this
        }
0
 

Author Comment

by:LorenzoB
ID: 33581765
To answer to your question, I needed to Inherit from a List<T> because I want to have the FindAll and the Clone (DeepCopy not Shallow).

Your suggestion was indeed helpful.

MemberwiseClone() cannot be called by an extension method of a generics list because it is a private member.
So I did a sort of implementation of the MemberwiseClone.
In the following extract of code are the Extension methods. Maybe could be better written...
The class NavigationElement inherits from ICloneable and implements the Clone() method.

In this way I avoid to create a new Class that inherits from List<NavigationElement>, because the implementation of the Extension Methods.

Thank You
 public static class ListExtensions
        {
            public static object Clone<T>(this List<NavigationElement> list)
            {
                return list.MemberwiseClone<T>();               
            }

            public static List<NavigationElement> MemberwiseClone<T>(this List<NavigationElement> list)
            {
                List<NavigationElement> newList = new List<NavigationElement>();
                foreach (NavigationElement navElem in list)
                {
                    newList.Add((NavigationElement)navElem.Clone());
                }
                return newList; 
            }
        }

Open in new window

0

Featured Post

Guide to Performance: Optimization & Monitoring

Nowadays, monitoring is a mixture of tools, systems, and codes—making it a very complex process. And with this complexity, comes variables for failure. Get DZone’s new Guide to Performance to learn how to proactively find these variables and solve them before a disruption occurs.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Suggested Solutions

Title # Comments Views Activity
c#, case, if 4 18
How to set focus on a dynamic control 18 21
Set arraylist as datatable 2 7
asp.net repeater 2 7
More often than not, we developers are confronted with a need: a need to make some kind of magic happen via code. Whether it is for a client, for the boss, or for our own personal projects, the need must be satisfied. Most of the time, the Framework…
Today I had a very interesting conundrum that had to get solved quickly. Needless to say, it wasn't resolved quickly because when we needed it we were very rushed, but as soon as the conference call was over and I took a step back I saw the correct …
The Email Laundry PDF encryption service allows companies to send confidential encrypted  emails to anybody. The PDF document can also contain attachments that are embedded in the encrypted PDF. The password is randomly generated by The Email Laundr…

749 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question