c# - 在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'.'
解决方案
不要使用Single
from 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);
推荐阅读
- swift - 当项目已经关闭时关闭项目检查状态
- string - Flutter 操作字符串
- jquery - JQuery shown.bs.modal 不会触发
- python - Python:从 jupyter notebook 执行终端命令
- google-apps-script - 在线编写脚本时将 JavaScript 变量(或结构化数据)转换为谷歌表格?除了函数之外还有什么?
- css - 生产中的 css 更改
- go - 霍夫曼编码导致错误的输出但正确的长度
- c# - 如何在 C# 中正确使用 CreateTextServices、ITextHost?
- swift - 便利初始化程序不断崩溃,但指定的初始化程序工作正常?
- python - 如果我得到一个 Qt 小部件的 Python 实例,有没有办法导出/复制它?