Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从另一个类访问类中的变量_C#_Class_Instance Variables - Fatal编程技术网

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

    }