如何在C#中获取类变量的引用?

时间:2019-12-04 12:09:13

标签: c# ref

如何获取类中变量的引用?我正在尝试获取在其他地方使用该变量的参考,并且需要将这些更改反映到其栖息地中。

 public class PowerComINC
 {
     static int IMALF1_A = 0; //INSTRUCTOR MALF ID FOR MISC FUNCTION
     static int IMALF2_A = 0; //INSTRUCTOR MALF ID FOR MISC FUNCTION
     static int IMFIRE_A = 0; //INSTRUCTOR MALF ID FOR FIRE 

     public static ref int GetAssociatedGlobals(string variableName)
     {
         // return ref of variableName
     }
}

...

ref int val = ref PowerComINC.GetAssociatedGlobals("IMALF1_A");

val++;

Console.Writeln(PowerComINC.IMALF1_A); //Print 1

3 个答案:

答案 0 :(得分:2)

您可以简单地创建一个Dictionary<string, int>来将这些信息存储为字符串和int对,而不是依赖于变量名。那么您根本不需要所有ref的东西:

public class PowerComINC
{
    public Dictionary<string, int> MyDict = new Dictionary<string, int>() 
    { 
        { "IMALF1_A", 0 }, 
        { "IMALF2_A", 0 }, 
        { "IMFIRE_A", 0 } 
    };
}

现在只需按其键引用一个值:

Console.Writeln(PowerComINC.MyDict("IMALF1_A")); //Print 1

根据您的评论:您仍然可以使用反射填充的二分法:

myDict = typeof(PowerComINC).GetFields(BindingFlags.Static | BindingFlags.NonPublic).ToDictionary(x => x.Name, x => x)

这为您提供了一个包含变量名称和FieldInfo实例的字典,该实例代表该字段,然后您可以使用它来获取实际值:

myDict["IMALF1_A"].GetValue(null);

您甚至可以将其更改为Dictionary<string, Func<int>>,因此yu可以直接获取变量值:

myDict = typeof(PowerComINC).GetFields(BindingFlags.Static | BindingFlags.NonPublic)
    .ToDictionary(x => x.Name, x => new Func<int>(() => (int) x.GetValue(null));

您现在可以使用以下命令来调用它-确实很奇怪-语法:

var i = myDict["IMALF1_A"]();

答案 1 :(得分:2)

您如何做到这一点? Like so

ref int val = ref PowerComINC.GetAssociatedGlobals("IMALF1_A");
val++;
Console.WriteLine(PowerComINC.IMALF1_A);

请注意在变量声明和赋值前缀中都使用ref。 (您也可以使用ref var val = ...,即类型将隐式确定,但仍然需要ref。)

您的方法大概是这样实现的:

public class PowerComINC
 {
     internal static int IMALF1_A = 0; //INSTRUCTOR MALF ID FOR MISC FUNCTION
     internal static int IMALF2_A = 0; //INSTRUCTOR MALF ID FOR MISC FUNCTION
     internal static int IMFIRE_A = 0; //INSTRUCTOR MALF ID FOR FIRE 

     public static ref int GetAssociatedGlobals(string variableName)
     {
         switch (variableName)
         {
            case "IMALF1_A":
                return ref IMALF1_A;
            case "IMALF2_A":
                return ref IMALF2_A;
            case "IMFIRE_A":
                return ref IMFIRE_A;
         }
         throw new ArgumentException(nameof(variableName));
     }
}

但是,正如HimBromBeere所说,以这种方式解决这个问题毫无意义。 switch查找的性能下降将始终超过直接突变像int这样小的引用变量的任何性能优势,而现在您无需封装任何字段。

答案 2 :(得分:0)

您可以避免使用字典或开关,而可以在对象的字段中使用搜索,而不必使用Type对象的GetField()方法。

所有这些ref东西都很复杂,我发现没有办法用GetField()。GetValue()resuld来制作ref,所以我建议您为此做getter和setter。

由于类是静态的,因此必须使用typeof关键字

并且您的变量一定不能是私有的,才能在GetField()中找到

public static int getval (string varname)
        {
            return (int)typeof(PowerComINC).GetField(varname).GetValue(typeof(int));
        }

public static void setval(string varname, int value)
        {
            typeof(PowerComINC).GetField(varname).SetValue(typeof(int), value);
        }

然后在您使用的方法中

int val = getval("IMALF1_A");
val++;
setval("IMALF1_A", val);