Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#使用字符串访问结构_C#_Unity3d - Fatal编程技术网

C#使用字符串访问结构

C#使用字符串访问结构,c#,unity3d,C#,Unity3d,我有点沉迷于我的比赛。我有一门课叫Upgradebuttons。从这个类中,我想从另一个类访问存储在结构中的一些变量。我可以通过键入classname.structname.preferedvar轻松访问变量,但structname取决于单击的升级。所以我想用字符串调用结构。我试过: MethodInfo method = typeof(Classname).GetMethod(structname); 但这只有在它是一个空的而不是一个结构时才有效。我需要做什么才能让它工作

我有点沉迷于我的比赛。我有一门课叫Upgradebuttons。从这个类中,我想从另一个类访问存储在结构中的一些变量。我可以通过键入classname.structname.preferedvar轻松访问变量,但structname取决于单击的升级。所以我想用字符串调用结构。我试过:

       MethodInfo method = typeof(Classname).GetMethod(structname);
但这只有在它是一个空的而不是一个结构时才有效。我需要做什么才能让它工作

    public class UpgradeButtons : MonoBehaviour {

       public void somefunction{
          // here i want to have access

      }

 }
这是我想要访问的类的一个示例:

    public class Upgrades: MonoBehaviour {
        public struct Upgrade1{
            public const int Cost = 10;
            public const float Value = 0.1f;
            public static string Naam = "Autoclicker";
       }
 }

只需从
字符串Naam中删除static即可:

 public class Upgrades: MonoBehaviour {
        public struct Upgrade1{
            public const int Cost = 10;
            public const float Value = 0.1f;
            public string Naam = "Autoclicker";
       }

 }

当一个对象(类、变量、方法)被定义为
static
时,它不能通过实例引用。

只需从
字符串Naam
中删除static即可:

 public class Upgrades: MonoBehaviour {
        public struct Upgrade1{
            public const int Cost = 10;
            public const float Value = 0.1f;
            public string Naam = "Autoclicker";
       }

 }

当一个对象(类、变量、方法)被定义为
静态
时,它不能通过实例引用。

如果我理解你的问题,你可能是在正确的轨道上。由于插件所依赖的结构(类型)可能存在,也可能不存在,因此反射是最好的方法

请尝试Assembly.GetType()或相关方法,以尝试加载该类型、检查其存在性并迭代其成员


如果我理解你的问题,你的思路可能是对的。由于插件所依赖的结构(类型)可能存在,也可能不存在,因此反射是最好的方法

请尝试Assembly.GetType()或相关方法,以尝试加载该类型、检查其存在性并迭代其成员


虽然这是可能的,但它听起来像是考虑不周的设计。也许您可以使用一个通用的
结构升级
,并在运行时使用
名称
属性来查找它

例如:

public struct Upgrade
{
    public string Name;
    public int Cost;
    public float Value;

    public Upgrade(string name, int cost, float value)
    {
        this.Name = name;
        this.Cost = cost;
        this.Value = value;
    }
}

public class UpgradeButtons : MonoBehavior
{
    List<Upgrade> Upgrades = new List<Upgrade>();

    public void CreateButtons()
    {
        Upgrades.Add(new Upgrade("Autoclicker", 10, 0.1f));
        //etc...
    }

    public void somefunction()
    {
        Upgrade autoclickUpgrade = Upgrades.Where(p => p.Name == "Autoclicker").FirstOrDefault();

        if(autoclickUpgrade == null)
            throw new Exception("Could not find Autoclicker upgrade.");

        //do something with autoclickUpgrade
    }
}
公共结构升级
{
公共字符串名称;
公共成本;
公众浮动价值;
公共升级(字符串名称、整数成本、浮点值)
{
this.Name=Name;
成本=成本;
这个。值=值;
}
}
公共类升级按钮:MonoBehavior
{
列表升级=新列表();
公共void CreateButtons()
{
升级。添加(新升级(“Autoclicker”,10,0.1f));
//等等。。。
}
公共函数()
{
Upgrade Autoclick Upgrade=Upgrades.Where(p=>p.Name==“Autoclicker”).FirstOrDefault();
if(autoclickUpgrade==null)
抛出新异常(“找不到自动单击器升级”);
//用Autoclick升级做些什么
}
}

虽然这是可能的,但听起来像是考虑不周的设计。也许您可以使用一个通用的
结构升级
,并在运行时使用
名称
属性来查找它

例如:

public struct Upgrade
{
    public string Name;
    public int Cost;
    public float Value;

    public Upgrade(string name, int cost, float value)
    {
        this.Name = name;
        this.Cost = cost;
        this.Value = value;
    }
}

public class UpgradeButtons : MonoBehavior
{
    List<Upgrade> Upgrades = new List<Upgrade>();

    public void CreateButtons()
    {
        Upgrades.Add(new Upgrade("Autoclicker", 10, 0.1f));
        //etc...
    }

    public void somefunction()
    {
        Upgrade autoclickUpgrade = Upgrades.Where(p => p.Name == "Autoclicker").FirstOrDefault();

        if(autoclickUpgrade == null)
            throw new Exception("Could not find Autoclicker upgrade.");

        //do something with autoclickUpgrade
    }
}
公共结构升级
{
公共字符串名称;
公共成本;
公众浮动价值;
公共升级(字符串名称、整数成本、浮点值)
{
this.Name=Name;
成本=成本;
这个。值=值;
}
}
公共类升级按钮:MonoBehavior
{
列表升级=新列表();
公共void CreateButtons()
{
升级。添加(新升级(“Autoclicker”,10,0.1f));
//等等。。。
}
公共函数()
{
Upgrade Autoclick Upgrade=Upgrades.Where(p=>p.Name==“Autoclicker”).FirstOrDefault();
if(autoclickUpgrade==null)
抛出新异常(“找不到自动单击器升级”);
//用Autoclick升级做些什么
}
}

谢谢你们两位的快速回复@mrjoltcola&@apomene!我删除了static并添加了:
assem=typeof(升级);类型m_Type=assem.GetType(“升级.Upgrade1”)到升级按钮脚本。但是,我没有收到任何错误,但是当我调试.Log(m_类型)时,它不会记录任何内容。当我输入m_类型时。它不会返回这些变量。我现在很困惑,你接受了一个不会动态加载任何内容的答案,那么你是在之前还是之后发布了此评论?你是对的,但他告诉我“这听起来像是一个考虑不周的设计。”所以我想也许我可以把它改成他的建议,然后继续前进。谢谢你们两位的快速回复@mrjoltcola&@apomene!我删除了static并添加了:
assem=typeof(升级);类型m_Type=assem.GetType(“升级.Upgrade1”)到升级按钮脚本。但是,我没有收到任何错误,但是当我调试.Log(m_类型)时,它不会记录任何内容。当我输入m_类型时。它不会返回这些变量。我现在很困惑,你接受了一个不会动态加载任何内容的答案,那么你是在之前还是之后发布了此评论?你是对的,但他告诉我“这听起来像是考虑不周的设计”。所以我想也许我可以更好地将其更改为他的建议,并从中继续前进。