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