我有很多课程,称他们为Class1
,Class2
,......等等。这些类中的每一个都有两个变量TestDictionary
和TestListDictionary
,如下所示。这些类中的每一个也从另一个类DoWork()
调用方法OtherClass
,并传入包含类名"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
关键字并仍然遇到同样的错误。
答案 0 :(得分:2)
您正尝试使用object
类访问静态成员。您可以使用类而不是其实例访问静态成员。获取类的类型,不要创建该类型的实例。
修改强>
您可以使用GetField
和GetValue
来获取静态字段,即TestDictionary
,注意您必须提供(assembly-qualified name)包含传递的类名称的命名空间在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"]);
答案 1 :(得分:0)
不使用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;
答案 2 :(得分:0)
在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;
答案 3 :(得分:0)
尝试继承像这样的类
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;
}
}
我使用了字符串来简化它。你可以使用字典或任何你想要的对象