views:

60

answers:

2
+2  Q: 

Get class type?

Given

public class A
{
    public static void Foo()
    {
        // get typeof(B)
    }
}

public class B : A
{

}

Is it possible for B.Foo() to get typeof(B) in .NET 4? Note that Foo is static.

+4  A: 

There is no difference between A.Foo() and B.Foo(). The compiler emits a call to A.Foo() in both cases. So, no, there is no way to detect if Foo was called as A.Foo() or B.Foo().

dtb
+2  A: 

Unfortunately this isn't possible, as dtb explains.

One alternative is to make A generic like so:

public class A<T>
{
    public static void Foo()
    {
        // use typeof(T)
    }
}

public class B : A<B>
{
}

Another possibility is to make the A.Foo method generic and then provide stub methods in the derived types that then call the "base" iplementation.

I'm not keen on this pattern. It's probably only worthwhile if you absolutely need to keep the B.Foo calling convention, you can't make A itself generic, and you have lots of shared logic inside A.Foo that you don't want to repeat in your derived types.

public class A
{
    protected static void Foo<T>()
    {
        // use typeof(T)
    }
}

public class B : A
{
    public static void Foo()
    {
        A.Foo<B>();
    }
}
LukeH
That's the same solution I wound up discovering :) (the first one). Works pretty well! Thanks.
Mark