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

C# 使用反射获取c上字段的值#,c#,C#,我想获取子字段('m_fullDescriptor')的值,但它会抛出如下错误。如何获取子字段的值 结构 代码 我得到下面的错误 System.ArgumentException: 'Field 'm_fullDescriptor' defined on type 'OracleInternal.ConnectionPool.PoolManager`3[OracleInternal.ConnectionPool.OraclePoolManager,OracleInternal.Connecti

我想获取
子字段('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'.'

您正试图获取
OracleInternal.ConnectionPool.OraclePoolManager
类型上存在的
m\u fullDescriptor
的值,但您正在将一个对象(
con
)传递给
GetValue
,该对象不是该类型

类似的东西应该可以工作,但是,我无法测试它,因为我没有访问Oracle数据库的权限

var pmCSField = connection.GetType().GetFields(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance).Single(pi => pi.Name == "pmCS");

var m_pmField = pmCSField.FieldType.GetFields(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance).Single(pi => pi.Name == "m_pm");

var m_fullDescriptorField = m_pmField.FieldType.GetFields(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance).Single(pi => pi.Name == "m_fullDescriptor");

var pmCSFieldValue = pmCSField.GetValue(connection);

var m_pmFieldValue = m_pmField.GetValue(pmCSFieldValue);

var m_fullDescriptorFieldValue = m_fullDescriptorField.GetValue(m_pmFieldValue);

不要使用Linq中的
Single
来查找所需字段。使用
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);

你明白错误信息吗?您正在寻找错误类型的字段。如果一行中没有这么多的调用链接在一起,那么对代码进行推理可能会更容易。如图所示,field是该字段的子字段,而chield是另一个字段的子字段。我怎么能说它更简单呢?字段类型为字符串。你看到了什么不同吗?把它分成多行,这样你至少可以调试它。我已经调试好了,不走运。
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);