C# 从另一个类访问类中的变量
我有很多类,称它们为C# 从另一个类访问类中的变量,c#,class,instance-variables,C#,Class,Instance Variables,我有很多类,称它们为Class1,Class2,…,等等。每个类都有两个变量,TestDictionary和TestListDictionary,如下所示。这些类中的每一个还从另一个类调用一个方法DoWork(),并传入一个包含类名称的字符串(“Class1”、“Class2”、…) 但是我无法访问TestDictionary和TestListDictionary(错误“无法解析符号'TestDictionary'/'TestListDictionary') 假设由于各种原因,我无法将这两个变量
Class1
,Class2
,…,等等。每个类都有两个变量,TestDictionary
和TestListDictionary
,如下所示。这些类中的每一个还从另一个类调用一个方法DoWork()
,并传入一个包含类名称的字符串(“Class1”、“Class2”、…
)
但是我无法访问TestDictionary
和TestListDictionary
(错误“无法解析符号'TestDictionary'/'TestListDictionary')
假设由于各种原因,我无法将这两个变量直接传递给DoWork
函数。我将如何访问它们
编辑:我尝试删除
static
关键字,但仍然遇到相同的错误。您正在尝试使用类的对象访问静态成员。您可以使用类而不是其实例访问静态成员。获取类的类型,而不创建该类型的实例
编辑
您可以使用GetField
和GetValue
来获取静态字段,即TestDictionary
,注意您必须给出()以包含传入Type.GetType
的类名的命名空间
var newType = Type.GetType(className);
var newDictionary=newType.TestDictionary
var newDictionary=(Dictionary)newType.GetField(“TestDictionary”).GetValue(null);
//添加(“1”,“你好”);
//Console.WriteLine(Class1.TestDictionary[“1”]);
不使用反射
最简单的方法是创建一个字典
,其中包含要访问的集合。类名用作键
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>();
另一个类可以通过以下方式访问它们:
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!";
尝试像这样继承类
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;
}
}
我使用字符串简化了它。你可以使用字典或任何你想要的对象传入类名对我来说就像是一种代码味道。使用继承可能是更好的设计方法。我希望能够访问的每个实例中TestDictionary
和TestListDictionary
的任何值>Class1
,Class2
,…等等。我明白了。我尝试删除static
关键字,但仍然有相同的错误。不清楚您试图做什么。您试图从哪个类访问TestDictionary的哪个实例?DoWork()如何调用?调用“OtherClass”指的是什么?每个类1到n都有一个TestDictionary的实例。DoWork是OtherClass中的一个方法,在每个类1到n中调用,需要引用该类的TestDictionary和TestListDictionary的实例。这就清楚了吗?这回答了一个技术性问题,但我确实你不认为它触及了OP所做的事情的真正问题。它也没有以OP可能理解的方式解释问题。我不明白它是如何工作的。Type类没有那些静态属性。你需要使用反射来获取值。newType.GetField(“TestDictionary”,BindingFlags.Public | BindingFlags.static).GetValue(null);
我明白了,谢谢您消除了差异!我尝试了您建议的代码,但仍然出现错误“无法解析符号'TestDictionary'/'TestListDictionary'“。我尝试删除静态
并使用我最初发布的代码,但仍然得到相同的错误。@user24607按照Selman22的建议获取词典时出现问题。”。检查我更新的答案。这个答案仍然完全没有抓住要点,即OP使用带有静态字段的类来代替对象。
Globals.Dictionaries.Add("Class1", TestDictionary);
Globals.ListDictionaries.Add("Class1", TestListDictionary);
Globals.Dictionaries[classname].Add(key, value);
int count = Globals.ListDictionaries[classname].Count;
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;
}
}