簡體   English   中英

從另一個類訪問一個類中的變量

[英]Accessing variables in a class from another class

我有很多類,稱它們為Class1Class2 ,...,依此類推。 這些類每個都有兩個變量,分別為TestDictionaryTestListDictionary ,如下所示。 這些類中的每個類還從另一個類OtherClass調用方法DoWork() ,並傳入包含類名稱的字符串( "Class1", "Class2", ... )。

public class Class1
{
    public static Dictionary<string, string> TestDictionary = ...
    public static ListDictionary TestListDictionary
    ...
    OtherClass.DoWork(GetType().Name);
}

我希望函數DoWork能夠訪問兩個變量TestDictionaryTestListDictionary 我想做以下事情:

DoWork(string className)
{
    var newClass = Activator.CreateInstance(Type.GetType(className));
    var newDictionary = newClass.TestDictionary;
    var newListDictionary = newClass.TestListDictionary;
    ...
}

但是我無法訪問TestDictionaryTestListDictionary (錯誤“無法解析符號'TestDictionary'/'TestListDictionary')。

假設由於各種原因,我無法將這兩個變量直接傳遞給DoWork函數。 我將如何訪問它們?

編輯:我嘗試刪除static關鍵字,但仍然遇到相同的錯誤。

您正在嘗試使用class object訪問靜態成員。 您可以使用class而不是其實例訪問靜態成員。 獲取類的類型,而不創建該類型的實例。

編輯

您可以使用GetFieldGetValue來獲取靜態字段,即TestDictionary ,請注意,您必須提供( 程序集限定名稱 ),其中包括在Type.GetType傳遞的類名稱的名稱空間。

var newType  = Type.GetType(className);

var newDictionary = newType.TestDictionary;

var newDictionary = (Dictionary<string, string>)newType.GetField("TestDictionary").GetValue(null);
//newDictionary.Add("1","hello");
//Console.WriteLine(Class1.TestDictionary["1"]);

不使用Reflection最簡單方法是創建一個包含要訪問的集合的Dictionary 類名用作鍵。

public static class Globals
{
    public static readonly Dictionary<string, Dictionary<string, string>> Dictionaries
         = new Dictionary<string, Dictionary<string, string>>();
    public static readonly Dictionary<string, ListDictionary> ListDictionaries
         = new Dictionary<string, ListDictionary>();

}

現在, Class1可以添加自己的字典,如下所示:

Globals.Dictionaries.Add("Class1", TestDictionary);
Globals.ListDictionaries.Add("Class1", TestListDictionary);

另一個類可以通過以下方式訪問它們:

Globals.Dictionaries[classname].Add(key, value);
int count = Globals.ListDictionaries[classname].Count;

Class1 ,定義為靜態的變量:

public static Dictionary<string, string> TestDictionary = new Dictionary<string,string>();
public static string test = "hey!";

可以從另一個類訪問:

var newDictionary = Class1.TestDictionary;
string test = Class1.test;

嘗試繼承這樣的類

public abstract class abstractA
    {
        public abstract string  TestDictionary { get; set; }
        public abstract string TestListDictionary { get; set; }
       // public abstract string returnDictionary();
        public void   DoWork()
        {
            Console.WriteLine(this.TestDictionary);
            // do anything with the properties         
        }
    }

    public class classA : abstractA
    {
        public override string TestDictionary { get; set; }
        public override string TestListDictionary { get; set; }
        public classA(string a, string b )
        {
            this.TestDictionary = a;
            this.TestDictionary = b; 
        }

    }

我使用了字符串來簡化它。 您可以使用字典或任何想要的對象

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM