Force calling the derived class implementation within a generic function in C#?

Posted by Adam Hardy on Stack Overflow See other posts from Stack Overflow or by Adam Hardy
Published on 2010-05-03T23:57:07Z Indexed on 2010/05/04 0:08 UTC
Read the original article Hit count: 165

Filed under:
|
|
|

Ok so I'm currently working with a set of classes that I don't have control over in some pretty generic functions using these objects. Instead of writing literally tens of functions that essentially do the same thing for each class I decided to use a generic function instead.

Now the classes I'm dealing with are a little weird in that the derived classes share many of the same properties but the base class that they are derived from doesn't. One such property example is .Parent which exists on a huge number of derived classes but not on the base class and it is this property that I need to use.

For ease of understanding I've created a small example as follows:

class StandardBaseClass {} // These are simulating the SMO objects

class StandardDerivedClass : StandardBaseClass {    
    public object Parent { get; set; }    
}

static class Extensions    
{    
        public static object GetParent(this StandardDerivedClass sdc) {
            return sdc.Parent;
        }

        public static object GetParent(this StandardBaseClass sbc)
        {
            throw new NotImplementedException("StandardBaseClass does not contain a property Parent");
        }

        // This is the Generic function I'm trying to write and need the Parent property.    
        public static void DoSomething<T>(T foo) where T : StandardBaseClass
        {
            object Parent = ((T)foo).GetParent();
        }

}

In the above example calling DoSomething() will throw the NotImplemented Exception in the base class's implementation of GetParent(), even though I'm forcing the cast to T which is a StandardDerivedClass.

This is contrary to other casting behaviour where by downcasting will force the use of the base class's implementation.

I see this behaviour as a bug. Has anyone else out there encountered this?

© Stack Overflow or respective owner

Related posts about c#

Related posts about generics