在c#上使用反射获取字段的值。

我想获得 subfield('m_fullDescriptor') 然而,它抛出了一个错误,如下面。我怎样才能得到子字段的值?

结构。

在这里输入图像描述enter image description here代码。

 public class FieldsClass
        {
            public string fieldA;

            public FieldsClass()
            {
                fieldA = "A public field";
            }
        }


FieldsClass fieldsInst = new FieldsClass();

var specFields = con.GetType().GetFields(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance).Single(pi => pi.Name == "pmCS").FieldType.GetFields(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance).Single(pi => pi.Name == "m_pm").FieldType.GetFields(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance).Single(pi => pi.Name == "m_fullDescriptor");

fieldsInst.fieldA= (string)specFields.GetValue(con);

我得到了下面的错误信息,我想获取子字段(‘m_fullDescriptor’)的值,但是却得到了下面的错误信息。

System.ArgumentException: 'Field 'm_fullDescriptor' defined on type 'OracleInternal.ConnectionPool.PoolManager`3[OracleInternal.ConnectionPool.OraclePoolManager,OracleInternal.ConnectionPool.OraclePool,OracleInternal.ServiceObjects.OracleConnectionImpl]' is not a field on the target object which is of type 'Oracle.ManagedDataAccess.Client.OracleConnection'.'

解决方案:

不要使用 “m_fullDescriptor”。Single 从Linq找到你需要的字段。使用 GetField 方法,它已经取了字段的确切名称。标志也可以重复使用。

为了得到值,需要在定义字段的地方传递一个对象。

我相信这应该是可行的,没有经过测试。

var flags = BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance;

var pmCS = connection.GetType().GetField("pmCS", flags).GetValue(connection);
var m_pm = pmCS.GetType().GetField("m_pm", flags).GetValue(pmCS);
var m_fullDescriptor = m_pm.GetType().GetField("m_fullDescriptor", flags).GetValue(m_pm);

给TA打赏
共{{data.count}}人
人已打赏
未分类

Keycloak - 如何为keycloak库中使用的http客户端设置超时。

2022-9-13 13:12:18

未分类

VS代码中红色矩形内的文字是什么意思?

2022-9-13 13:12:20

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索