如何获取类中变量的引用?我正在尝试获取在其他地方使用该变量的参考,并且需要将这些更改反映到其栖息地中。
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
答案 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);