Visual Basic(2010) - 在嵌入式文本文件中使用变量?

时间:2013-05-02 11:27:32

标签: vb.net variables embedded-resource

我总是能够在这里搜索我需要的东西,而且我通常很容易找到它,但这似乎是一个例外。

我正在用Visual Basic 2010 Express编写一个程序,这是一个相当简单的基于文本的冒险游戏。

我有一个故事,根据您选择的按钮/选项有多个可能的路径。 每个故事路径的文本都保存在自己的嵌入式资源.txt文件中。我可以直接将文本文件的内容写入VB,这样可以解决我的问题,但这不是我想要这样做的方式,因为这样看起来会非常混乱。

我的问题是我需要在我的故事中使用变量名称,这里是一个嵌入文本文件的内容示例,

"When "+playername+" woke up, "+genderheshe+" didn't recognise "+genderhisher+" surroundings."

我使用以下代码将文件读入我的文本框

Private Sub frmAdventure_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    Dim thestorytext As String
    Dim imageStream As Stream
    Dim textStreamReader As StreamReader
    Dim assembly As [Assembly]
    assembly = [assembly].GetExecutingAssembly()
    imageStream = assembly.GetManifestResourceStream("Catastrophe.CatastropheStoryStart.png")
    textStreamReader = New StreamReader(assembly.GetManifestResourceStream("Catastrophe.CatastropheStoryStart.txt"))
    thestorytext = textStreamReader.ReadLine()
    txtAdventure.Text = thestorytext
End Sub

在某种程度上有效,但显示与文本文件完全相同,保留引号和+ s以及变量名称,而不是删除引号和+ s,并用变量名称替换变量名称变量。

任何人都可以告诉我需要更改或添加以使其工作吗?

谢谢,并且如果在某处已经回答这个问题而道歉,我只是不认为它是解决方案或者不知道要搜索什么来找到它或什么的。

1 个答案:

答案 0 :(得分:1)

由于您的应用程序已编译,因此您不能将一些VB代码放在文本文件中,并在读取它时执行它。

可以做什么,以及通常做的是,您将某些标记保留在文本文件中,然后找到它们并用实际值替换它们。

例如:

When %playername% woke up, %genderheshe% didn`t recognise %genderhisher% surroundings.

然后在您的代码中,您会找到所有标记:

Dim matches = Regex.Matches(thestorytext, "%(\w+?)%")
For Each match in matches
    ' the tag name is now in: match.Groups(1).Value
    ' replace the tag with the value and replace it back into the original string
Next

当然,最大的问题仍然存在 - 这就是如何填写实际值。不幸的是,没有干净的方法来做到这一点,特别是使用任何局部变量。

您可以手动维护Dictionary标记名称及其值,也可以使用 Reflection 直接在运行时获取值。虽然它应该小心使用(速度,安全性......),但它可以很好地适用于你的情况。

假设您将所有变量定义为与读取和处理此文本的代码在同一个类(Me)中的属性,代码将如下所示:

Dim matches = Regex.Matches(thestorytext, "%(\w+?)%")
For Each match in matches
    Dim tag = match.Groups(1).Value
    Dim value = Me.GetType().GetField(tag).GetValue(Me)
    thestorytext = thestorytext.Replace(match.Value, value) ' Lazy code
Next

txtAdventure.Text = thestorytext

如果您不使用属性,只使用字段,请将行更改为:

Dim value = Me.GetType().GetField(tag).GetValue(Me)

请注意,此示例很粗糙,如果标记拼写错误或不存在(您应该进行一些错误检查),代码会很快崩溃,但它应该让您开始。