简体   繁体   中英

C# How to treat static class as a variable

I have a static Class and within it I have multiple public static attributes. I treat this class as my global class.

However now I need to treat this class as a variable so that I can pass it to a method of another class for processing..

I can't instantiate this class.. So in effect I can only assign the variables inside this class.

Is my understanding correct or am I missing something?

public static class Global
{
    public const int RobotMax = 2;

    // GUI sync context
    public static MainForm mainForm;
    public static SynchronizationContext UIContext;

    // Database
    public static Database DB = null;
    public static string localDBName = "local.db";
    public static Database localDB = null;
    public static Database ChangeLogDB = null;
    public static string changeLogDBName = "ChangeLog.db";
 }

Let say I have a class like this, and I need to somehow keep a copy of this in another class maybe

public static class Global_bk
{
    public const int RobotMax = 2;

    // GUI sync context
    public static MainForm mainForm;
    public static SynchronizationContext UIContext;

    // Database
    public static Database DB = null;
    public static string localDBName = "local.db";
    public static Database localDB = null;
    public static Database ChangeLogDB = null;
    public static string changeLogDBName = "ChangeLog.db";
 }

I need to copy the contents from Global to Global_bk.

And after that I need to compare the contents of the two classes in a method like

static class extentions
{
    public static List<Variance> DetailedCompare<T>(T val1, T val2)
    {
        List<Variance> variances = new List<Variance>();
        FieldInfo[] fi = val1.GetType().GetFields();
        foreach (FieldInfo f in fi)
        {
            Variance v = new Variance();
            v.Prop = f.Name;
            v.valA = f.GetValue(val1);
            v.valB = f.GetValue(val2);
            if (!v.valA.Equals(v.valB))
                variances.Add(v);

        }
        return variances;
    }
}

class Variance
{
    string _prop;
    public string Prop
    {
        get { return _prop; }
        set { _prop = value; }
    }
    object _valA;
    public object valA
    {
        get { return _valA; }
        set { _valA = value; }
    }
    object _valB;
    public object valB
    {
        get { return _valB; }
        set { _valB = value; }
    }
}

So on my main form, how do I go about calling the compare method and passing the static Global class inside?

example: extentions.DetailedCompare(Global, Global_bk) ? Of course this would give me an error because I cant pass a type as a variable.

Please help me, this is driving me nuts...

How about the singleton pattern ? You can pass reference to shared interface (IDoable in exable below) and still have just one instance.

IE:

public interface IDoable {
  int Value { get; set; }
  void Foo();
}

public static class DoableWrapper {
  private MyDoable : IDoable {
    public int Value { get;set; }
    public void Foo() {
    }
  }

  private static IDoable s_Doable = new MyDoable();
  public static IDoable Instance {
    get { return s_Doable; }
  }
}

Singleton is the way to go here. You can do it like this:

internal class SomeClass
{
   private static SomeClass singleton;

   private SomeClass(){}  //yes: private constructor

   public static SomeClass GetInstance()
   {
        return singleton ?? new SomeClass();
   }

    public int SomeProperty {get;set;}

    public void SomeMethod()
    {
        //do something
    }
 }

The GetInstance Method will return you a SomeClass object that you can edit and pass into whatever you need.

You can access the members with classname.membername.

internal static class SomeClass
{
    public static int SomeProperty {get;set;}

    public static void SomeMethod()
    {
        //do something
    }
 }

 static void main()
 {
     SomeClass.SomeProperty = 15;
     SomeClass.SomeMethod();
 }

The only way you are going to obtain a variable with the "class" information is using reflection. You can get a Type object for the class.

namespace Foo {

public class Bar
{
}

}


Type type = Type.GetType("Foo.Bar");

Otherwise, if you are really describing a class "instance" then use an object and simply instantiate one.

C# offers no other notation for class variables.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM