Search code examples
c#.netcompiler-construction

How to store a reference to a static class?


So something like:

public static class StaticClass {}

public class InstanceClass
{
    static StaticClass StaticProperty {get;set;}

    public InstanceClass()
    {
        InstanceClass.StaticProperty = StaticClass;
    }
}

I thought one could do this but the compiler returns these errors:

static types cannot be used as parameters

static types cannot be used as return types

EDIT: I know that this doesn't work, but why? I imagine StaticClass is stored somewhere in memory, so other variables could be allowed to refer to it at the same memory, right?

EDIT2: One of the use cases would be something like this:

Say you have 5 different static classes you have collected with no source code, and they do generic stuff, so you want to have convenient access to them through a single static class. You could do it like:

public static class GenericStuff
{
    public LinearAlgebra LinearAlgebra {get;set;}
    public StringUtilities String {get;set;}
    public GeometryOps Geometry {get;set;}
}

And use it like:

GenericStuff.LinearAlgebra.GetAngleBetweenVectors(v0, v1);

Some other use cases you could think of.


Solution

  • Update: I am going to use my psychic powers to try and figure what I think you're trying to do.

    I'm guessing you have a static class with some methods that you want to access from within another class. Is that right?

    Something like this, in other words:

    static class HelperMethods
    {
        public static void SomeHelperMethod();
    }
    

    ...and what you want to do is something like this?

    class SomeOtherClass
    {
        public void MethodThatUsesHelperMethod()
        {
            // You want to be able to have "Helper" mean "HelperMethods"?
            Helper.SomeHelperMethod();
        }
    }
    

    If I've interpreted you correctly, there's only one way (that I can think) to sort of accomplish what you're after. This would be to add a using declaration to effectively alias your static type:

    // At top of file
    using Helper = HelperMethods;
    

    Note that if you do this, you're creating a file-wide alias. There's no way to alias classes at only the class level.


    StaticClass is the name of the class. Your StaticProperty property expects an instance of the class, which will never exist because the class is static.

    I'm actually surprised you can even have a property typed as a static class, since it represents a total impossibility. (Oh wait, you can't do that; that's what you were saying.)

    You say you want to store a "reference to a static class"; I have to assume you mean that you want a reference to the Type object representing the class, in which case you should do this:

    public Type StaticProperty { get; set; }
    
    // ...
    
    StaticProperty = typeof(StaticClass);