C# 如何从引用库的项目中获取变量?

C# 如何从引用库的项目中获取变量?,c#,.net,class,variables,dll,C#,.net,Class,Variables,Dll,假设我有一个 public struct Level { public Level(int _Id) { Id = _Id; } public int Id { get; } public void NextLevel() { } } 在参考库中, 这是: static vo

假设我有一个

public struct Level
    {

        public Level(int _Id)
        {
            Id = _Id;
        }

        public int Id { get; }

        public void NextLevel()
        { 
            
        }
        
    }

在参考库中, 这是:

        static void Main(string[] args)
        {
            Level Lvl1 = new Level(0);
            Level Lvl2 = new Level(1);
            Level Lvl3 = new Level(2);

            //some code..
            //some code..
            //some finish code..
            Level.NextLevel();
        }
在引用dll库的项目中

现在,我希望库中的NextLevel()方法通过Id从一个级别更改为另一个级别,即使该变量在库中不存在,但在项目中存在

假设玩家完成1级,方法被调用。 该方法应通过Id获取级别2,如果该级别不存在,则应引发自定义异常


注意:我没有使用unity或任何其他C#游戏引擎。我正在制作自己的引擎。

如果不提供类的局部作用域变量,则无法神奇地访问它

也就是说,您可以这样做:

public class Level
    {

        public Level(int _Id)
        {
            Id = _Id;
        }

        public int Id { get; }

        public Level NextLevel { get; set; }
        
    }
然后

static void Main(string[] args)
        {
            Level Lvl1 = new Level(0);
            Level Lvl2 = new Level(1);
            Level Lvl3 = new Level(2);

            Lvl1.NextLevel = Lvl2;

            //some code..
            //some code..
            //some finish code..
            if (Level.NextLevel == null)
                // throw exception
             else
                // do stuff
        }
如果不让Level结构获取引用,那么它就无法知道它

另一种方法是使用持久性(数据库、文件等)并从那里共享数据


您可以使用这样的方法搜索整个进程内存,但不建议使用这种方法,因为它不符合OOP,并且可能导致意外问题(例如使用从GC中拾取的未引用变量,从而干扰托管代码)。

如果我理解正确,您需要动态链接库(DLL)其中包含您的级别类。然后您希望从游戏项目访问该类。为此,您需要创建库项目并编译DLL文件。然后将该DLL文件添加为对游戏项目的引用。然后您需要“使用库的命名空间”,即使用DLLNamespace;。以下是示例:我将如何处理这个问题:

类库项目(DLL)

我创建了一个
LevelManager
类,其中包含可用级别的
列表。
LevelManager
实例可以通过调用
CreateLevel()添加新级别
方法。然后,您可以访问游戏项目中的当前关卡、下一关卡和可用关卡数。我还添加了一个名为
WhatIsNextLevel
的属性,如果出于某种原因需要,您可以在不加载下一关卡的情况下检索下一关卡

您也可以使用
字典
而不是
列表
,并使用键作为级别的ID

using System.Collections.Generic;
using System.Linq;

namespace LevelLibrary
{
    public class LevelManager
    {
        public List<Level> Levels { get; set; } = new List<Level>();
        public Level CurrentLevel => Levels.Where(l => l.ID == currentLevel).FirstOrDefault();
        public Level WhatIsNextLevel => Levels.Where(l => l.ID == currentLevel + 1).FirstOrDefault(); // Get the next level without changing the current level
        public int LevelsAvailable => Levels.Count();

        private int currentLevel = 0;

        public class Level
        {
            public int ID { get; set; }

            public Level(int id)
            {
                ID = id;
            }
        }

        public Level CreateLevel()
        {
            Level newLevel = new Level(Levels.Count + 1);
            Levels.Add(newLevel);
            if (currentLevel == 0) currentLevel = 1;

            return newLevel;
        }

        public Level NextLevel()
        {
            currentLevel++;
            return CurrentLevel;
        }

    }
}

你可能需要
类游戏
和级别集合。方法
Game.NextLevel()
更有意义。好吧,没关系,我在问题中输入的代码只是我“可能”想要的一个例子。但我不知道如何从引用库访问变量。“如何从引用库访问变量"-什么变量?
Id
?因为它不是静态的,所以您需要
Level
实例,例如
Lvl1.Id
。事实上
Level
类型属于引用库并没有什么区别。我想说的是,如果库代码通过Id向项目请求变量X,那么项目会给他变量,然后项目也可以作为下一个X签名。我不理解这个问题。没有
X
,您能更具体地说明它是什么吗?建议的
Game
类可以包含属性
CurrentLevel
,所有方法(位于库内)可以访问。如果它是公共属性,那么您也可以在
Main
中访问它。第一个代码会给我错误,但从结构更改为类是可以的。我会告诉它何时工作。您说得很对,我第一次尝试时就错过了结构部分。它现在已更改。它不工作。我希望下一个级别在库中,而不是在数据库中项目。问题是,我不知道如何使库能够获取项目的变量。“如何使库能够获取项目的变量”-尝试给出一个非常具体的例子,说明什么是变量以及为什么不能访问它。因此,在库中,有一些if代码,当玩家触摸完成符号时(游戏引擎在控制台中)库调用一个名为NextLevel()的方法,此方法应通过上一级别的id获取下一级别变量。我不知道如何从项目中获取变量到库。
using LevelLibrary; // Use your Class Library (DLL) namespace (Don't forget to add it as a reference)

namespace Game
{
    class Game
    {
        static void Main(string[] args)
        {
            LevelManager levelManager = new LevelManager();

            // Create some example levels
            for (int i = 0; i <= 2; i++)
            {
                levelManager.CreateLevel();
            }

            Console.WriteLine($"Starting on level {levelManager.CurrentLevel.ID.ToString()}");

            // Loop through more levels than we have just to show an example
            // of how you can change to the next level and handle null
            for (int i = 0; i <= 3; i++)
            {
                levelManager.NextLevel();

                //some code..
                //some code..
                //some finish code..
                if (levelManager.CurrentLevel == null)
                {
                    Console.WriteLine("There are no more levels");
                }
                else
                {
                    Console.WriteLine($"Level is now {levelManager.CurrentLevel.ID.ToString()}");
                }
            }
            Console.ReadLine(); // Keep the window open so you can see the output
        }
    }
}