我想要获取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'.'
发布于 2020-04-27 19:30:51
不要使用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);
发布于 2020-04-27 18:55:04
您正在尝试获取存在于OracleInternal.ConnectionPool.OraclePoolManager
类型上的m_fullDescriptor
的值,但是您正在向GetValue
传递一个不属于该类型的对象(con
)。
这样的东西应该可以工作,但是,我无法测试它,因为我没有访问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);
https://stackoverflow.com/questions/61461465
复制相似问题