在循环中截取变量名

时间:2018-03-29 08:23:15

标签: 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 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();  
    } 

我在使用该对象的类中需要循环对象“Data”而我不能使用数组,因为属于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();
}

IODBTLMNG_data由以下内容组成:

public class IODBTLMNG_data
{
    public int T_code;
    public int life_count;
}

如果我需要提取T_code,我可以使用反射吗?感谢

解决了编辑:

好的......我在这种模式下使用支持变量IODBTLMNG_data(obj_data)解决了:

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

 result[i] = obj_data.T_code;

由于

2 个答案:

答案 0 :(得分:5)

如果必须使用IODBTLMNG类,而无法重新设计,我建议使用 Reflection

 using System.Reflection;

 ...

 result[i] = (int) (obj.GetType().GetField($"data{i + 1}").GetValue(obj));

编辑换句话说(参见评论),如果您想按名称阅读public实例)字段:

 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

答案 1 :(得分:0)

你可以把它包装成能给你一个数组/类似List的存取器的东西 您甚至可以将它设为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();
}

调用代码

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;
}