C# 在循环中截取变量名

C# 在循环中截取变量名,c#,C#,我正在创建一个函数,用于读取自定义对象中的整数内容 自定义对象包含在包装类中,由以下部分组成: public class IODBTLMNG { public int data0 = new int(); public int data1 = new int(); public int data2 = new int(); public int data3 = new int(); public int da

我正在创建一个函数,用于读取自定义对象中的整数内容

自定义对象包含在包装类中,由以下部分组成:

public class IODBTLMNG
    {
        public int data0 = new int();
        public int data1 = new int();
        public int data2 = new int();
        public int data3 = new int();
        public int data4 = new int();
        public int data5 = new int();
        public int data6 = new int();
        public int data7 = new int();
        public int data8 = new int();
        public int data9 = new int();
        public int data10 = new int();  
    } 
我需要在类中使用对象,以循环对象“数据”,并且我不能使用数组,因为属于dll的原始函数不允许使用它(使用DllExtern包装类)。 我想要实现的函数应该循环使用DataX字段。 我在下面写一个例子:

 private int[] GetInteger()
    {
        int[] result = new int[10];

        IODBTLMNG obj = new IODBTLMNG();
        obj = PopolateObject();

        for (int i = 0; i < 11; i++)
        {
            result[i] = obj.(data + i); // The problem is this (Data i)
        }

        return result;
    }
IODBTLMNG_数据由以下部分组成:

public class IODBTLMNG
{
    public IODBTLMNG_data data1 = new IODBTLMNG_data();
    public IODBTLMNG_data data2 = new IODBTLMNG_data();
    public IODBTLMNG_data data3 = new IODBTLMNG_data();
    public IODBTLMNG_data data4 = new IODBTLMNG_data();
    public IODBTLMNG_data data5 = new IODBTLMNG_data();
    public IODBTLMNG_data data6 = new IODBTLMNG_data();
    public IODBTLMNG_data data7 = new IODBTLMNG_data();
    public IODBTLMNG_data data8 = new IODBTLMNG_data();
    public IODBTLMNG_data data9 = new IODBTLMNG_data();
    public IODBTLMNG_data data10 = new IODBTLMNG_data();
}
public class IODBTLMNG_data
{
    public int T_code;
    public int life_count;
}
如果我需要提取T_代码,我可以使用反射吗?谢谢

已解决编辑:

好的……我在该模式下使用支持变量IODBTLMNG_data(obj_data)解决了这个问题:

obj_data = (IODBTLMNG_data)(obj.GetType().GetField($"data{i}").GetValue(obj));
以及:

谢谢

如果您必须使用
IODBTLMNG
类,并且无法重新设计它,我建议使用反射:

编辑:换句话说(参见注释),如果您想按名称读取
公共
(实例)字段:

 var obj = ...
 string fieldName = "T_code"; // or "life_count", or "data5" - whatever

 object value = obj     // for the instance obj
   .GetType(fieldName)  // get its type (IODBTLMNG_data)
   .GetField()          // given type, find (with a help of Reflect) field description
   .GetValue(obj);      // read field's value for the obj instance

 int myResult = (int) value; // cast to int
如果您必须按原样使用
IODBTLMNG
类,并且无法重新设计它,我建议使用反射:

编辑:换句话说(参见注释),如果您想按名称读取
公共
(实例)字段:

 var obj = ...
 string fieldName = "T_code"; // or "life_count", or "data5" - whatever

 object value = obj     // for the instance obj
   .GetType(fieldName)  // get its type (IODBTLMNG_data)
   .GetField()          // given type, find (with a help of Reflect) field description
   .GetValue(obj);      // read field's value for the obj instance

 int myResult = (int) value; // cast to int

您可以将它包装成一个数组/列表,如访问器
您甚至可以将其设置为
IEnumerable
,以便与LINQ等一起使用

public class IODBTLMNGWrapper: IEnumerable<int>
{
    private readonly IODBTLMNG wrapped;

    public IODBTLMNGWrapper(IODBTLMNG wrapped)
    {
        this.wrapped = wrapped ?? throw new ArgumentNullException(nameof(wrapped));
    }

    public int Length { get; } = 11;

    public int this[int index]
    {
        get
        {
            switch(index)
            {
                case 0: return wrapped.data0;
                case 1: return wrapped.data1;
                case 2: return wrapped.data2;
                case 3: return wrapped.data3;
                case 4: return wrapped.data4;
                case 5: return wrapped.data5;
                case 6: return wrapped.data6;
                case 7: return wrapped.data7;
                case 8: return wrapped.data8;
                case 9: return wrapped.data9;
                case 10: return wrapped.data10;
                default:
                    throw new ArgumentOutOfRangeException($"Bad index {index}");
            }
        }
        set
        {
            switch (index)
            {
                case 0: wrapped.data0 = value; break;
                case 1: wrapped.data1 = value; break;
                case 2: wrapped.data2 = value; break;
                case 3: wrapped.data3 = value; break;
                case 4: wrapped.data4 = value; break;
                case 5: wrapped.data5 = value; break;
                case 6: wrapped.data6 = value; break;
                case 7: wrapped.data7 = value; break;
                case 8: wrapped.data8 = value; break;
                case 9: wrapped.data9 = value; break;
                case 10:wrapped.data10 = value; break;
                default:
                    throw new ArgumentOutOfRangeException($"Bad index {index}");
            }
        }
    }

    public IEnumerator<int> GetEnumerator()
    {
        for (int i = 0; i <= 10; i++)
            yield return this[i];
    }

    IEnumerator IEnumerable.GetEnumerator()
        => GetEnumerator();
}

您可以将它包装成一个数组/列表,如访问器
您甚至可以将其设置为
IEnumerable
,以便与LINQ等一起使用

public class IODBTLMNGWrapper: IEnumerable<int>
{
    private readonly IODBTLMNG wrapped;

    public IODBTLMNGWrapper(IODBTLMNG wrapped)
    {
        this.wrapped = wrapped ?? throw new ArgumentNullException(nameof(wrapped));
    }

    public int Length { get; } = 11;

    public int this[int index]
    {
        get
        {
            switch(index)
            {
                case 0: return wrapped.data0;
                case 1: return wrapped.data1;
                case 2: return wrapped.data2;
                case 3: return wrapped.data3;
                case 4: return wrapped.data4;
                case 5: return wrapped.data5;
                case 6: return wrapped.data6;
                case 7: return wrapped.data7;
                case 8: return wrapped.data8;
                case 9: return wrapped.data9;
                case 10: return wrapped.data10;
                default:
                    throw new ArgumentOutOfRangeException($"Bad index {index}");
            }
        }
        set
        {
            switch (index)
            {
                case 0: wrapped.data0 = value; break;
                case 1: wrapped.data1 = value; break;
                case 2: wrapped.data2 = value; break;
                case 3: wrapped.data3 = value; break;
                case 4: wrapped.data4 = value; break;
                case 5: wrapped.data5 = value; break;
                case 6: wrapped.data6 = value; break;
                case 7: wrapped.data7 = value; break;
                case 8: wrapped.data8 = value; break;
                case 9: wrapped.data9 = value; break;
                case 10:wrapped.data10 = value; break;
                default:
                    throw new ArgumentOutOfRangeException($"Bad index {index}");
            }
        }
    }

    public IEnumerator<int> GetEnumerator()
    {
        for (int i = 0; i <= 10; i++)
            yield return this[i];
    }

    IEnumerator IEnumerable.GetEnumerator()
        => GetEnumerator();
}

使用反射是可能的。如果您可以将
IODBTLMNG
类更改为包含int数组而不是不同的属性,那么就可以不进行反射。我个人会使用另一个具有数组的类。使用它,然后映射到
IODBTLMNG
的一个新实例,如果需要,可以使用反射进行编辑。如果您可以将
IODBTLMNG
类更改为包含int数组而不是不同的属性,那么就可以不进行反射。我个人会使用另一个具有数组的类。使用它,然后映射到
IODBTLMNG
的新实例,当所需的dif数据是包含以下内容的结构时:public class IODBTLMNG_data{public int T_code;public int life_count;}如果我需要提取T_代码,我应该如何处理反射?感谢you@Tarma对不起?我不明白你的意思。我希望通过名称读取
obj
s字段(让它成为
“theFieldName”
):
object result=obj.GetType().GetField(theFieldName).GetValue(objj)如果数据是包含以下内容的结构:public class IODBTLMNG_data{public int T_code;public int life_count;}如果需要提取T_代码,我应该如何处理反射?感谢you@Tarma对不起?我不明白你的意思。我希望通过名称读取
obj
s字段(让它成为
“theFieldName”
):
object result=obj.GetType().GetField(theFieldName).GetValue(objj)
private int[] SumItemsGreaterThan1000(IODBTLMNG data)
{
    var wrapper = IODBTLMNGWrapper(data);
    int sum = 0;
    foreach(var i in wrapper.Where(n => n > 1000)
        sum += i;
    return sum;
}