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