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

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;

谢谢

最佳答案

如果您必须按原样使用IODBTLMNG 类并且您不能重新设计它,我建议使用Reflection :

 using System.Reflection;

 ...

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

编辑:换句话说(见评论),如果您想通过名称读取public(instance)字段:

 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

关于c# - 在循环中拦截变量名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49551232/

相关文章:

c# - 使用固定装置测试 Entity Framework

c# - Char 到 int 隐式转换幕后

c# - 如何在安装时(或在编译时轻松配置)配置 Windows 服务的名称?

c# - 从命令行向 OpenFire 房间发送 XMPP 消息

c# - 将 Samba 的 S-1-22-[12]-* SID 映射到名称中

c# - 使用 C# 获取应用程序的安装版本

c# - Datagrid 中的工具提示,从代码隐藏中添加

c# - 拆分一批要发送到 Azure 服务总线的消息

c# - 一行中 4 个整数或 2 个 double 值的精确匹配的正则表达式

c# - 是否有一种更易读的方式来制作一长串 && 语句?