【问题标题】:Accessing variables in a class from another class从另一个类访问一个类中的变量
【发布时间】:2023-04-07 06:01:01
【问题描述】:

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

【问题讨论】:

  • 传入类名对我来说似乎是一种代码味道。使用继承可能是更好的设计方式
  • 我希望能够访问 TestDictionaryTestListDictionary 在每个 Class1Class2 等实例中的任何值。
  • 我明白了。我尝试删除 static 关键字,但仍然有同样的错误。
  • 不清楚您要做什么。您尝试从哪个类访问 TestDictionary 的哪个实例? DoWork() 是如何被调用的? “OtherClass”指的是什么?
  • 从 1 到 n 的每个类都有一个 TestDictionary 实例。 DoWork 是OtherClass 中的一个方法,在1 到n 的每个类中调用,并且需要引用该类的TestDictionary 和TestListDictionary 实例。这样就清楚了吗?

标签: c# class instance-variables


【解决方案1】:

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

编辑

您可以使用GetFieldGetValue 来获取静态字段,即TestDictionary,注意您必须提供包含Type.GetType 中传递的类名的命名空间的(assembly-qualified name)。

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"]);

【讨论】:

  • 这回答了技术性问题,但我真的不认为它解决了 OP 正在做什么的真正问题。它也没有以 OP 可能理解的方式解释问题。
  • 我不明白它是如何工作的。类型类没有那些静态属性。你需要使用反射来获取值。 newType.GetField("TestDictionary", BindingFlags.Public |BindingFlags.Static).GetValue(null);
  • 我明白了,感谢您消除差异!我尝试了您建议的代码,但仍然收到错误“无法解析符号'TestDictionary'/'TestListDictionary'”。我尝试删除 static 并使用我最初发布的代码,但仍然得到相同的错误。
  • @user2424607 按照 Selman22 的建议获取字典时出现问题。检查我更新的答案。
  • 这个答案仍然完全没有抓住重点,即 OP 使用 具有静态字段的类 代替 objects
【解决方案2】:

不使用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;

【讨论】:

    【解决方案3】:

    尝试像这样继承类

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

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

    【讨论】:

      【解决方案4】:

      Class1中,一个变量定义为静态:

      public static Dictionary<string, string> TestDictionary = new Dictionary<string,string>();
      public static string test = "hey!";
      

      可以从另一个类访问:

      var newDictionary = Class1.TestDictionary;
      string test = Class1.test;
      

      【讨论】:

        猜你喜欢
        • 2020-11-24
        • 1970-01-01
        • 1970-01-01
        • 2017-03-22
        • 1970-01-01
        • 1970-01-01
        • 2014-01-18
        • 2011-10-22
        相关资源
        最近更新 更多