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

C# 在c中的数组中存储ushort的引用#,c#,reference,C#,Reference,我想将ushort变量的引用存储在ushort数组中,这样当我更改ushort数组中的值时,变量的值就会更改。下面是我的示例代码,它将清晰地描述我试图实现的目标 public void IndexSetter(List<int> indexVal,Rootobject objectVal) { ushort[] refereneArray = new ushort[8] { objectVal.index1, objectVal.index2,

我想将
ushort
变量的引用存储在
ushort数组中
,这样当我更改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];
    }  
}
public void indexetter(List indexVal,Rootobject objectVal)
{
ushort[]referencearray=新的ushort[8]
{
objectVal.index1,objectVal.index2,
objectVal.index3,objectVal.index4,
objectVal.index5,objectVal.index6,
objectVal.index7、objectVal.index8
};
对于(int j=0;j

我需要存储引用,以使
indexVal
列表中的更改反映在index1、index2的值中,而不是像上面代码中那样存储值。。etc

您可以使用不安全的代码,使用如下指针数组:

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];
        }
    }
}
静态不安全的无效索引设置器(IList indexVal、Rootobject objectVal){
已修复(ushort*r1=&objectVal.index1)
已修复(ushort*r2=&objectVal.index2){
ushort*[]引用array={r1,r2};
对于(int j=0;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++;
    }
}
静态void indexetter2(IList indexVal,Rootobject objectVal){
int i=0;
foreach(objectVal.GetType().GetFields(BindingFlags.Public | BindingFlags.Instance)中的var字段)
其中(c=>c.Name.StartsWith(“索引”)和&c.FieldType==typeof(ushort))
.OrderBy(c=>c.Name)){
field.SetValue(objectVal,indexVal[i]);
i++;
}
}

我建议不要有8个名称完全相同的索引(除了一个数字)。给你的类中的每个成员一个名字来描述它是什么,然而
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];
}
public void indexetter(List indexVal,Rootobject objectVal)
{
for(int i=0;i
甚至更短:

objectVal.Indexes = indexVal.Cast<ushort>().ToArray();
objectVal.index=indexVal.Cast().ToArray();

这是不可能的
ushort
不是引用类型,而是值类型。为什么不存储对
Rootobject
anway的引用呢?(我想这是一个类)可能是@adjan Thank的复制品..是的。Rootobject是一个类。我只需要这些索引值作为参考。因为我从未使用过设置引用,所以我不确定如何存储对Rootobject的引用。你能告诉我怎么做吗?谢谢你的代码。但是我没有任何问题。我在indexVal列表中有一组值,该列表根据json文件输入动态生成。解析json后,我需要从json中获取索引值(索引值的数量是一个变量,可以是2或3,也可以是全部8)。我需要编写一个代码,从indexVal列表中获取值,并将其设置为Rootobject类中的ushort索引变量。有没有更好的方法来做到这一点?如果性能不是超临界的-你可以用反射枚举Rootobject中的字段,并直接设置值(不带数组)。你的意思是像做变量的浅拷贝一样?我用反射方法更新了答案。但如果可能,最好使用其他答案的解决方案。