2014-10-20 62 views
-1

我有一個靜態類,在它內部我有多個公共靜態屬性。我把這個課程當作我的全球課程。C#如何將靜態類作爲一個變量

但是現在我需要把這個類作爲變量,這樣我可以把它傳遞給另一個類進行處理的方法..

我不能實例化這個類。所以實際上我只能分配這個類中的變量。

我的理解是正確的還是我錯過了什麼?

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"; 
} 

讓我們說我有這樣一類的,我需要以某種方式保持該副本複製到另一個階級也許

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"; 
} 

我需要複製來自全球的內容Global_bk。

此後,我需要兩個類的內容方法比較喜歡

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; } 
    } 
} 

所以我的主要形式,我怎麼去調用比較方法並傳遞靜態全局類中?

示例:extentions.DetailedCompare(Global,Global_bk)?當然,這會給我一個錯誤,因爲我不能將類型作爲變量傳遞。

請幫助我,這是推動我堅果...

回答

0

您可以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(); 
} 
+0

當然。但是,我如何訪問所有成員/變量等的類本身呢? – CJC 2014-10-20 04:58:21

+0

靜態類的所有成員都是靜態的...如果你想訪問它們使其成爲公共或內部。然後使用類名稱。成員(方法屬性...) – 2014-10-20 05:01:28

+0

是的,我也明白這一點。它是公開的。但我需要將類本身作爲變量傳遞給函數/成員的參數。我不想單獨傳遞每個變量/成員/屬性/屬性。我基本上想把它的內容複製到另一個相同的類,以便我可以在兩者之間進行比較。 – CJC 2014-10-20 05:05:44

2

單身模式怎麼樣?您可以將引用傳遞給共享接口(下面的exo中的IDoable),並且仍然只有一個實例。

即:

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; } 
    } 
} 
1

辛格爾頓是去這裏的路。你可以這樣說:

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 
    } 
} 

getInstance方法將返回一個SomeClass的對象,您可以編輯和傳遞到任何你所需要的。

0

要使用「類」信息獲取變量的唯一方法是使用反射。您可以獲得該類的Type對象。否則,如果你真的在描述一個類「實例」,那麼使用一個對象並簡單地實例化一個對象。

C#不提供類變量的其他表示法。