如何为具有多个类的整个项目定义变量? C#

时间:2019-07-17 21:29:33

标签: c# global-variables

我有一个包含多个班级的项目。为了运行脚本,我需要打开一个excel表以读取它,并在脚本中使用该表中的值。目前,我必须在每个班级中打开和阅读Excel工作表。如何定义变量,这样我只需要打开excel工作表一次并一次读取所有值?我需要能够在许多不同的类中使用这些值。每个类都已经继承了另一个类,所以我不能使用继承。

2 个答案:

答案 0 :(得分:1)

您可以将静态类与静态变量一起使用

创建一个包含您的公共全局变量的静态公共类 像这样

public static class Globals
  {
 public static int mypublic_varible_1=0;
  }

然后您可以创建一个将值分配给变量的方法,它将是另一个类。

public class assign_values{
   Globals.mypublic_varible_1=100;//data_read_from_excel

 }

现在您的 Globals.mypublic_varible_1 的值为100,因为您可以从另一个类中调用它。

答案 1 :(得分:0)

做到这一点的一种方法称为依赖注入,这是我们可以将对象传递给该类所依赖的类的地方。如果我们在类中添加构造函数,以使用代表excel文档的类的实例(即通过阅读文档填充了该实例),则这些类可以共享同一文档。

例如,这是一个简单的类,代表我们从excel文档中读取的内容:

public class ExcelDocument
{
    public string SomeValue { get; set; }
    public string SomeOtherValue { get; set; }

    public override string ToString()
    {
        return $"SomeValue: {SomeValue}, SomeOtherValue: {SomeOtherValue}";
    }
}

这是两个类,它们在其构造函数中使用ExcelDocument的实例,然后在其中操作值(例如):

public class ClassOne
{
    private ExcelDocument excelDoc;

    public ClassOne(ExcelDocument document)
    {
        excelDoc = document;
    }

    public void DoSomethingWithExcelData()
    {
        excelDoc.SomeValue = "Modified in ClassOne";
    }
}

public class ClassTwo
{
    private ExcelDocument excelDoc;

    public ClassTwo(ExcelDocument document)
    {
        excelDoc = document;
    }

    public void DoSomethingWithExcelData()
    {
        excelDoc.SomeOtherValue = "Modified in ClassTwo";
    }
}

现在,在主程序中,我们可以读取文档并填充类(在这里,我只是将属性设置为“原始值”,而不是读取实际文档),然后可以将类传递给每个上面两个类中的一个,以便他们可以操作它:

public class Program
{
    private static void Main()
    {
        // "Read" an excel document and set properties in this class
        var excelDoc = new ExcelDocument
        {
            SomeValue = "original Value",
            SomeOtherValue = "original value"
        };

        // Instantiate the classes above so they can use the document without re-reading it
        var class1 = new ClassOne(excelDoc);
        var class2 = new ClassTwo(excelDoc);

        // Output the original values of our document
        Console.WriteLine(excelDoc);

        // Have each class do their operations on the document
        class1.DoSomethingWithExcelData();
        class2.DoSomethingWithExcelData();

        // Output the values again to show how the two independent classes 
        // manipulated the same document (and without reading it)
        Console.WriteLine(excelDoc);

        GetKeyFromUser("\nDone! Press any key to exit...");
    }
}

以下是输出:

enter image description here


请注意,您也不需要创建将文档作为构造函数参数的类。相反,您可以在文档中包含的类上创建公共方法,以便它们可以使用/操纵值。这样,您只需在类之间或方法之间“传递文档”,而不必重新读取每个类/方法中的excel工作表,例如,您可以:

public class ClassOne
{
    public static void DoSomethingWithExcelData(ExcelDocument excelDoc)
    {
        excelDoc.SomeValue = "Modified in ClassOne";
    }
}

然后执行:

private static void Main()
{
    var excelDoc = new ExcelDocument
    {
        SomeValue = "original Value",
        SomeOtherValue = "original value"
    };

    ClassOne.DoSomethingWithExcelData(excelDoc);