【问题标题】:Variable as function parameter?变量作为函数参数?
【发布时间】:2016-07-15 13:42:38
【问题描述】:

我正在做一种小型 rpg(角色扮演游戏),在对话中会有影响玩家某些变量的决定。我想知道你是否知道比我更有效的方法:

public string Name, Nickname;
public int Age;

public void Decision(string Var, string Input)
{
    if (Var == "Name")
        Name = Input;
    else if (Var == "Nickname")
        Nickname = Input;
    else if (Var == "Age")
        Age = Convert.ToInt32(Input);
}

如您所见,只有 3 个变量很长,但还有更多……有没有办法更快?像这样的:

public void Decision(Variable Var, string Input)
{
    Player.Var = input;
}

编辑:我将混合使用两个答案:

    public string Nom, Prenom;
    public int Age;

    public void Decision(InfoType type, string Input)
    {
        switch (type)
        {
            case InfoType.Name:
                Nom = Input;
                break;
            case InfoType.Prenom:
                Prenom = Input;
                break;
        }
    }
    public void Decision(InfoType type, int Input)
    {
        switch (type)
        {
            case InfoType.Age:
                Age = Convert.ToInt32(Input);
                break;
        }

    }

【问题讨论】:

  • int Age 永远不是 == string Var 尝试使用它来代替 if(Age == Convert.ToInt32(Var) { Age = Convert.ToInt32(Input); }
  • 为什么不直接赋值给你想要影响的变量呢?大概如果您能够为“Var”传递一个值,您就知道要更改哪个变量。
  • 老实说,这似乎是一个设计问题。为什么要尝试动态设置这些字段?
  • 如果您只是想稍微清理一下代码,您可以使用switch 语句来分解您的个别情况。基于字典的方法可能也有效(即Properties[Var] = value),但在这种情况下,您最好单独设置它们中的每一个而不是使用单个函数,特别是因为它们的类型可能不同(即整数和字符串)。
  • 因为我想把决定放在 XNA 文件中。

标签: c# variables parameters


【解决方案1】:

方法重载怎么样?

public void Decision(string Var, string Input)
{
    if (Var == "Name")
        Name = Input;
    else if (Var == "Nickname")
        Nickname = Input;
}

public void Decision(int Input)
{
    Age = input
}

【讨论】:

  • Ian 利用枚举和 case 语句的示例也强烈推荐用于类型安全
【解决方案2】:

您可以使用反射。这样做的缺点是您必须对复杂类型进行额外检查,但对于简单对象,它可以像这样工作。

public class MyObject {
    public string Name { get; set; }
    public string Nickname { get; set; }
    public int Age { get; set; }
}

public class TestReflection {
    public void Test() {
        var obj = new MyObject();

        UpdateObject(obj, "Name", "THis is a name");
        UpdateObject(obj, "Age", 99);
        UpdateObject(obj, "Nickname", "This is a nickname");

        Console.WriteLine("{0} {1} {2}", obj.Name, obj.Age, obj.Nickname);
        Console.ReadLine();
    }

    private void UpdateObject(MyObject obj, string varName, object varValue) {
        //Get Properties of the object
        var properties = obj.GetType().GetProperties();
        //Search for the property via the name passed over to the method.
        var prop = properties.FirstOrDefault(_ => _.Name.Equals(varName, StringComparison.InvariantCultureIgnoreCase));
        //Check prop exists and set to the object.
        if(prop != null) {
            prop.SetValue(obj, varValue);
        }
    }
}

【讨论】:

    【解决方案3】:

    您可以使用 switch 语句使事情变得更简洁,也可以使用枚举来确保类型安全。例如

    public enum InfoType {
        Name,
        Nickname,
        Age
    }
    
    public void Decision(InfoType type, string input)
    {
        switch (type)
        {
            case InfoType.Name:
                Name = input;
                break;
            case InfoType.NickName:
                NickName = input;
                break;
        }
    }
    

    等等。

    【讨论】:

    • 是的,我想我会这样做的。
    猜你喜欢
    • 2013-12-23
    • 2014-12-28
    • 2020-09-13
    • 2011-03-19
    • 1970-01-01
    • 1970-01-01
    • 2023-03-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多