从另一个类访问一个类中的变量

本文关键字:一个 变量 另一个 访问 | 更新日期: 2023-09-27 18:15:47

我有很多类,叫他们Class1, Class2,…等等。每一类都有两个变量,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关键字,仍然遇到同样的错误。

从另一个类访问一个类中的变量

您正在尝试使用类的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"]);

Class1中,定义为static的变量:

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

我已经使用字符串使它简单。你可以使用dictionary或者任何你想要的对象

不使用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;