我声明了几个int变量。
[SerializeField] private int currentHP, currentMP, maxHP, maxMP, attack, intelligence, defense, speed, critChance;
我想把它们输出到一个写着 "你的统计数据是xx "的文本中。我使用了下面的代码和 行得通:
if (maxHP > 0)
{
stats += string.Format("\n Your stat is {0}", maxHP);
}
但是,我想知道是否有办法避免为每个int复制粘贴这段代码。有可能吗?
谢谢!我有几个int变量被声明:
首先,把每个数据都放到一个数组中。
int[] statsArray = { currentHP, currentMP, maxHP, maxMP, attack, intelligence, defense, speed, critChance };
然后,用一个 LINQ查询 来为每个统计数字创建一个字符串。请注意,您可以使用 串插:
var strings = from stat in statsArray
where stat > 0 // filters out the non-positive stats, like your if statement does
select $"\nYour stat is {stat}."; // string interpolation
然后,将这些字符串连接起来,使用 string.Concat
:
stats = string.Concat(strings);
一个简单的方法,不需要用另一种方法来声明你的变量,就是创建一个函数。
private string GetStatString(int stat) {
if (stat> 0)
{
return string.Format("\n Your stat is {0}", maxHP);
}
return "";
}
而在你的代码中。
stats += GetStatString(maxpHP) + GetStatString(maxMp); // etc
如果你能把这些加到一个数组里 那工作就容易多了 你可以结合@扫地者的回答来做。
扫码者回答可能是最好的方法。
但是,如果你真的不想重复,甚至连字段名都不想重复,你可以使用反射来获取所有的 int
的类中。
var strings = GetType().GetFields(BindingFlags.NonPublic|BindingFlags.Instance);
.Select(field => field.GetValue(this))
.OfType<int>()
.Where(value => value > 0)
.Select(value => $"Your stat is {value}");
var concatenated = string.Join("\n", strings);
如果你想频繁地迭代所有的统计信息,也许使用一个字典或者一个 string
和 int
元组。
你也可以使用System.Reflection,以防你需要在运行时获取值,而不需要把字段放在一个数组中,并避免调整你的代码来打印功能。
public string GetStats()
{
string stats = string.Empty;
// Get a list of FieldInfo objects.
var fieldsInfo = GetType().GetFields(BindingFlags.NonPublic
| BindingFlags.Instance)
.Where(field => field.FieldType == typeof(int)).ToList();
foreach (var field in fieldsInfo)
{
int fieldValue = (int)field.GetValue(this);
if (fieldValue > 0)
{
stats += string.Format("\n Your stat is {0}", fieldValue);
}
}
return stats;
}