<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://weblogs.asp.net/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>David McCollough  : MSDN  forums</title><link>http://weblogs.asp.net/davidmccollough/archive/tags/MSDN++forums/default.aspx</link><description>Tags: MSDN  forums</description><dc:language>en</dc:language><generator>CommunityServer 2007 SP1 (Build: 20510.895)</generator><item><title>Covariant Generic List</title><link>http://weblogs.asp.net/davidmccollough/archive/2009/04/19/covariant-generic-list.aspx</link><pubDate>Mon, 20 Apr 2009 01:47:11 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:7050342</guid><dc:creator>dmccollough</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/davidmccollough/rsscomments.aspx?PostID=7050342</wfw:commentRss><comments>http://weblogs.asp.net/davidmccollough/archive/2009/04/19/covariant-generic-list.aspx#comments</comments><description>&lt;p&gt;&lt;font size="3"&gt;&lt;font face="Tahoma"&gt;&lt;font size="2"&gt;The other day I was working with some generic lists of some custom classes.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size="2" face="Tahoma"&gt;All of these classes inherited from a common base class.&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size="2" face="Tahoma"&gt;I wanted to write a method where I could pass any of my generic lists to this method and iterate over the list and execute some other code.&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size="2" face="Tahoma"&gt;I thought this was a perfect example for passing a generic type into my method. I tried everything I know and could not get this to work.&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size="2" face="Tahoma"&gt;I posted a question on the MSDN forums about my problem and John Grove pointed me at this &lt;a href="http://www..fotia.co.uk/fotia/DN.01.CoVariantGenericList.aspx"&gt;article&lt;/a&gt;.&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size="2" face="Tahoma"&gt;So it turns out what I was wanting was a Covariant Generic List.&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size="2" face="Tahoma"&gt;I pretty much followed what was outlined in the article, but I will document here what I exactly did, namely because I had a hard time finding the solution to this problem.&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size="2" face="Tahoma"&gt;This starts off by defining a interface for our base class.&lt;/font&gt;&lt;/p&gt;  &lt;pre&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;interface&lt;/span&gt; IClassInterface
{
   &lt;span style="color: #0000ff"&gt;string&lt;/span&gt; Property1 { &lt;span style="color: #0000ff"&gt;get&lt;/span&gt;; &lt;span style="color: #0000ff"&gt;set&lt;/span&gt;; }
   &lt;span style="color: #0000ff"&gt;string&lt;/span&gt; Property2 { &lt;span style="color: #0000ff"&gt;get&lt;/span&gt;; &lt;span style="color: #0000ff"&gt;set&lt;/span&gt;; }
}&lt;/pre&gt;

&lt;pre&gt;Then we have to define our base class, plus any class that
inherits from it.&lt;/pre&gt;

&lt;pre&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;class&lt;/span&gt; ClassA : IClassInterface
{
   &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; ClassA() {}
   
   &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; ClassA(ClassA objectA)
   {
      &lt;span style="color: #0000ff"&gt;this&lt;/span&gt;.Property1 = objectA.Property1;
      &lt;span style="color: #0000ff"&gt;this&lt;/span&gt;.Property2 = objectA.Property2;
   }

   &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; ClassA(&lt;span style="color: #0000ff"&gt;string&lt;/span&gt; property1, &lt;span style="color: #0000ff"&gt;string&lt;/span&gt; property2)
   {
      &lt;span style="color: #0000ff"&gt;this&lt;/span&gt;.Property1 = property1;
      &lt;span style="color: #0000ff"&gt;this&lt;/span&gt;.Property2 = property2;
   }

   &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;string&lt;/span&gt; Property1
   {
       &lt;span style="color: #0000ff"&gt;get&lt;/span&gt;; &lt;span style="color: #0000ff"&gt;set&lt;/span&gt;;
   }

   &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;string&lt;/span&gt; Property2
   {
       &lt;span style="color: #0000ff"&gt;get&lt;/span&gt;; &lt;span style="color: #0000ff"&gt;set&lt;/span&gt;;
   }
}

&lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;class&lt;/span&gt; ClassB : ClassA
{
    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; ClassB() {}

    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; ClassB(ClassA objectA, &lt;span style="color: #0000ff"&gt;string&lt;/span&gt; property3, &lt;span style="color: #0000ff"&gt;string&lt;/span&gt; property4)
                             : &lt;span style="color: #0000ff"&gt;base&lt;/span&gt;(objectA)
    {
       &lt;span style="color: #0000ff"&gt;this&lt;/span&gt;.Property3 = property3;
       &lt;span style="color: #0000ff"&gt;this&lt;/span&gt;.Property4 = property4;           
    }

    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;string&lt;/span&gt; Property3
    {
       &lt;span style="color: #0000ff"&gt;get&lt;/span&gt;; &lt;span style="color: #0000ff"&gt;set&lt;/span&gt;;
    }

    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;string&lt;/span&gt; Property4
    {
       &lt;span style="color: #0000ff"&gt;get&lt;/span&gt;; &lt;span style="color: #0000ff"&gt;set&lt;/span&gt;;
    }
}&lt;/pre&gt;

&lt;pre&gt;Next we define a class that a returns enumerable generic list.&lt;/pre&gt;

&lt;pre&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;class&lt;/span&gt; EnumerableGeneric&amp;lt;TClass, TInterface&amp;gt; 
              : IEnumerable&amp;lt;TInterface&amp;gt; where TClass : TInterface
{
   &lt;span style="color: #0000ff"&gt;private&lt;/span&gt; IList&amp;lt;TClass&amp;gt; list;

   &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; EnumerableGeneric(IList&amp;lt;TClass&amp;gt; list)
   {
      &lt;span style="color: #0000ff"&gt;this&lt;/span&gt;.list = list;
   }

   &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; IEnumerator&amp;lt;TInterface&amp;gt; GetEnumerator()
   {
      &lt;span style="color: #0000ff"&gt;foreach&lt;/span&gt; (TClass item &lt;span style="color: #0000ff"&gt;in&lt;/span&gt; list)
      {
         yield &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; item;
      }
   }

   IEnumerator IEnumerable.GetEnumerator()
   {
      &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; &lt;span style="color: #0000ff"&gt;this&lt;/span&gt;.GetEnumerator();
   }
}&lt;/pre&gt;

&lt;pre&gt;Next we define our method that we are going to use to perform
 some operation on each of the lists.&lt;/pre&gt;

&lt;pre&gt;&lt;span style="color: #0000ff"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; MyMethod(IEnumerable&amp;lt;IClassInterface&amp;gt; genericList)
{
   &lt;span style="color: #0000ff"&gt;foreach&lt;/span&gt; (IClassInterface classVariable &lt;span style="color: #0000ff"&gt;in&lt;/span&gt; genericList)
   {
      &lt;span style="color: #008000"&gt;// Other code goes here.&lt;/span&gt;
   }
}&lt;/pre&gt;

&lt;pre&gt;And finally we create our lists, populate some data and call our method.&lt;/pre&gt;

&lt;pre&gt;List&amp;lt;ClassA&amp;gt; caInstance = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; List&amp;lt;ClassA&amp;gt;();

caInstance.Add(&lt;span style="color: #0000ff"&gt;new&lt;/span&gt; ClassA(&amp;quot;&lt;span style="color: #8b0000"&gt;A&lt;/span&gt;&amp;quot;, &amp;quot;&lt;span style="color: #8b0000"&gt;B&lt;/span&gt;&amp;quot;));
caInstance.Add(&lt;span style="color: #0000ff"&gt;new&lt;/span&gt; ClassA(&amp;quot;&lt;span style="color: #8b0000"&gt;C&lt;/span&gt;&amp;quot;, &amp;quot;&lt;span style="color: #8b0000"&gt;D&lt;/span&gt;&amp;quot;));

List&amp;lt;ClassB&amp;gt; cbInstance = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; List&amp;lt;ClassB&amp;gt;();
cbInstance.Add(&lt;span style="color: #0000ff"&gt;new&lt;/span&gt; ClassB(&lt;span style="color: #0000ff"&gt;new&lt;/span&gt; ClassA(&amp;quot;&lt;span style="color: #8b0000"&gt;E&lt;/span&gt;&amp;quot;, &amp;quot;&lt;span style="color: #8b0000"&gt;F&lt;/span&gt;&amp;quot;), &amp;quot;&lt;span style="color: #8b0000"&gt;G&lt;/span&gt;&amp;quot;, &amp;quot;&lt;span style="color: #8b0000"&gt;H&lt;/span&gt;&amp;quot;));
cbInstance.Add(&lt;span style="color: #0000ff"&gt;new&lt;/span&gt; ClassB(&lt;span style="color: #0000ff"&gt;new&lt;/span&gt; ClassA(&amp;quot;&lt;span style="color: #8b0000"&gt;I&lt;/span&gt;&amp;quot;, &amp;quot;&lt;span style="color: #8b0000"&gt;J&lt;/span&gt;&amp;quot;), &amp;quot;&lt;span style="color: #8b0000"&gt;K&lt;/span&gt;&amp;quot;, &amp;quot;&lt;span style="color: #8b0000"&gt;L&lt;/span&gt;&amp;quot;));

MyMethod(&lt;span style="color: #0000ff"&gt;new&lt;/span&gt; EnumerableGeneric&amp;lt;ClassA, IClassInterface&amp;gt;(caInstance));

MyMethod(&lt;span style="color: #0000ff"&gt;new&lt;/span&gt; EnumerableGeneric&amp;lt;ClassB, IClassInterface&amp;gt;(cbInstance));&lt;/pre&gt;

&lt;p&gt;&lt;font size="2" face="Tahoma"&gt;&lt;/font&gt;&lt;/p&gt;

&lt;p&gt;&lt;font size="2" face="Tahoma"&gt;&lt;/font&gt;&lt;/p&gt;

&lt;p&gt;&lt;font size="2" face="Tahoma"&gt;&lt;/font&gt;&lt;/p&gt;

&lt;br /&gt;

&lt;p&gt;&lt;font size="2" face="Tahoma"&gt;I appreciate John Grove for taking the time on the MSDN forums to answer my question and also to &lt;a href="http://www.fotia.co.uk/fotia/Default.aspx"&gt;Stefan Delmarco&lt;/a&gt; for posting the original article.&lt;/font&gt;&lt;/p&gt;

&lt;p&gt;&lt;font size="2" face="Tahoma"&gt;&lt;/font&gt;&lt;/p&gt;

&lt;p&gt;&lt;font size="2" face="Tahoma"&gt;Hope this helps somebody else, I know it helped me.&lt;/font&gt;&lt;/p&gt;

&lt;p&gt;&lt;font size="2" face="Tahoma"&gt;&amp;#160;&lt;/font&gt;&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=7050342" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/davidmccollough/archive/tags/ASP.NET/default.aspx">ASP.NET</category><category domain="http://weblogs.asp.net/davidmccollough/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://weblogs.asp.net/davidmccollough/archive/tags/Covariant+Generic+List/default.aspx">Covariant Generic List</category><category domain="http://weblogs.asp.net/davidmccollough/archive/tags/Generics/default.aspx">Generics</category><category domain="http://weblogs.asp.net/davidmccollough/archive/tags/John+Grove/default.aspx">John Grove</category><category domain="http://weblogs.asp.net/davidmccollough/archive/tags/Stefan+Delmarco/default.aspx">Stefan Delmarco</category><category domain="http://weblogs.asp.net/davidmccollough/archive/tags/MSDN++forums/default.aspx">MSDN  forums</category></item></channel></rss>