我正在创建一个用于读取自定义对象中整数内容的函数。
自定义对象包含在包装类中,由以下内容组成:
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;
由于
答案 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;
}