从另一个类访问一个类中的变量
本文关键字:一个 变量 另一个 访问 | 更新日期: 2023-09-27 18:15:47
我有很多类,叫他们Class1
, Class2
,…等等。每一类都有两个变量,TestDictionary
和TestListDictionary
,如下所示。这些类中的每一个还调用另一个类OtherClass
的方法DoWork()
,并传入一个包含类名("Class1", "Class2", ...
)的字符串。
public class Class1
{
public static Dictionary<string, string> TestDictionary = ...
public static ListDictionary TestListDictionary
...
OtherClass.DoWork(GetType().Name);
}
我希望函数DoWork
能够访问两个变量TestDictionary
和TestListDictionary
。我想这样做:
DoWork(string className)
{
var newClass = Activator.CreateInstance(Type.GetType(className));
var newDictionary = newClass.TestDictionary;
var newListDictionary = newClass.TestListDictionary;
...
}
但我无法访问TestDictionary
和TestListDictionary
(错误"无法解析符号'TestDictionary'/'TestListDictionary')。
假设由于各种原因,我不能将这两个变量直接传递给DoWork
函数。我如何访问它们?
编辑:我试着删除static
关键字,仍然遇到同样的错误。
您正在尝试使用类的object
访问静态成员。您可以使用class而不是它的实例访问静态成员。获取类的类型,不要创建该类型的实例。
编辑
您可以使用GetField
和GetValue
来获得静态字段,即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;