首页 > 解决方案 > 在c#上使用反射获取字段的值

问题描述

我想获得价值,subfield('m_fullDescriptor')但是它会引发如下错误。我怎样才能得到子字段的值?

结构;

在此处输入图像描述 在此处输入图像描述 代码;

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

我得到以下错误;

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'.'

标签: c#

解决方案


不要使用Singlefrom 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);

推荐阅读