0

Let's say I have the following static class:

public static class Foo<T>
{
    private static T Baz;

    /* other members */

    public static void Bar()
    {
        //do something with Baz
    }
}

Is there a built-in way to call Bar() for all specific versions of the generic class without knowing the type parameters that were used? That is, if the consumer of Foo<T> has used it as Foo<Larry>, Foo<Curly> and Foo<Moe>, how can I call all the Foo<Larry>.Bar(), Foo<Curly>.Bar() etc. methods automatically without explicitly specifying the generic types?

Alexey
  • 1,354
  • 13
  • 30

2 Answers2

1

That is not possible. Use the static constructor of Foo<T> to maintain a global list of Baz values. That global list must be rooted in a static variable that lives outside of Foo<T>.

usr
  • 168,620
  • 35
  • 240
  • 369
0

The number of possibilities for T is infinite. There is no way to know what might be used for T. You can, using the static constructor, track the types that have already been used for T and perform an operation against all of those types.

Here I created a class with a static variable containing a list of Actions. Action matches the signature of void Bar(), so to call a different signature, use a different type i.e. Action<string> to call void Bar(string x) or Func<int,string> to call string Bar(int val).

public static class FooTracker
{
    public static List<Action> AllBars = new List<Action>();
    public static void CallAllBars()
    {
        AllBars.ForEach(v => v());
    }
}

public static class Foo<T>
{
    static Foo()
    {
        FooTracker.AllBars.Add(() => Bar());
    }

    public static void InitFoo() 
    { 
        // do nothing other than cause static constructor to run
    }


    private static T Baz;

    /* other members */

    public static void Bar()
    {
        //do something with Baz
        Debug.Print(typeof(T).Name);
    }
}

If you use the code below to call this, you will observe that Foo<Curly>.Bar() isn't called because the static constructor isn't run until after the CallAllBars() call.

Foo<Larry>.InitFoo();
Foo<Moe>.InitFoo();

FooTracker.CallAllBars();

Foo<Curly>.InitFoo();
Grax32
  • 3,986
  • 1
  • 17
  • 32
  • Why did you write `FooTracker.AllBars.Add(() => Bar());` instead of `FooTracker.AllBars.Add(Bar);`? – Alexey May 13 '15 at 08:01
  • No reason, just some bad habits of mine. Functionally it works the same but I think your version compile to better code, although I find my version easier to read. – Grax32 May 13 '15 at 10:42