在c#中将ushort的引用存储在数组中

时间:2017-06-15 07:04:06

标签: c# reference

我想在ushort中存储ushort array变量的引用,以便在更改ushort数组中的值时变量的值会发生变化。这是我的示例代码,它将清楚地展示我想要实现的目标。

public void IndexSetter(List<int> indexVal,Rootobject objectVal)
{
    ushort[] refereneArray = new ushort[8] 
    {
        objectVal.index1, objectVal.index2, 
        objectVal.index3 , objectVal.index4,
        objectVal.index5, objectVal.index6, 
        objectVal.index7, objectVal.index8 
    };
    for(int j = 0; j< indexVal.Count;j++)
    {
        refereneArray[j] =(ushort) indexVal[j];
    }  
}

我需要存储引用,以便indexVal列表中的更改反映在index1,index2等的值中,而不是存储上述代码中的值。

2 个答案:

答案 0 :(得分:0)

你可以使用不安全的代码,使用这样的指针数组:

static unsafe void IndexSetter(IList<ushort> indexVal, Rootobject objectVal) {
    fixed (ushort* r1 = &objectVal.index1)
    fixed (ushort* r2 = &objectVal.index2) {
        ushort*[] refereneArray = {r1, r2};
        for (int j = 0; j < indexVal.Count; j++) {
            *refereneArray[j] = (ushort) indexVal[j];
        }
    }
}

你真的应该在实际应用中做到这一点是另一回事。很有可能有更好的方法来解决您的问题,但您没有告诉我们实际问题是什么。

如果性能不重要 - 您可以使用反射:

static void IndexSetter2(IList<ushort> indexVal, Rootobject objectVal) {
    int i = 0;
    foreach (var field in objectVal.GetType().GetFields(BindingFlags.Public | BindingFlags.Instance)
                         .Where(c => c.Name.StartsWith("index") && c.FieldType == typeof(ushort))
                         .OrderBy(c => c.Name)) {
        field.SetValue(objectVal, indexVal[i]);
        i++;
    }
}

答案 1 :(得分:0)

我建议不要有8个名称完全相同的索引(数字除外)。给你班上的每个成员一个描述其内容的名称,但是NFS并不是真正的自我解释。

说完这个,你可以做的就是在你的类中拥有一个索引数组:

index6

现在您可以按如下方式访问它们:

class Rootobject
{
    public int[] Indexes { get; set; }
}

甚至更短:

public void IndexSetter(List<int> indexVal, Rootobject objectVal)
{
    for(int i = 0; i < indexVal.Count; i++)
        objectVal.Indexes[index] = indexVal[i];
}