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

时间:2014-07-31 16:12:48

标签: c# class instance-variables

我有很多课程,称他们为Class1Class2,......等等。这些类中的每一个都有两个变量TestDictionaryTestListDictionary,如下所示。这些类中的每一个也从另一个类DoWork()调用方法OtherClass,并传入包含类名"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关键字并仍然遇到同样的错误。

4 个答案:

答案 0 :(得分:2)

您正尝试使用object类访问静态成员。您可以使用类而不是其实例访问静态成员。获取类的类型,不要创建该类型的实例。

修改

您可以使用GetFieldGetValue来获取静态字段,即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; 
        }

    }

我使用了字符串来简化它。你可以使用字典或任何你想要的对象