c# - 获取受保护字段的值
问题描述
我的方法是从第三方代码传递一个对象作为参数。有问题的类称为:SqlExpression<T>
.
此类具有以下受保护字段:
protected List<ModelDefinition> tableDefs = new List<ModelDefinition>();
我需要该属性内的信息,但我已经检查了该类并且没有公共访问器。
我尝试创建一个子类:
public class SqlExpressionExtension<T> : SqlExpression<T>
{
public SqlExpressionExtension(IOrmLiteDialectProvider dialectProvider) : base(dialectProvider)
{
}
public List<Type> GeTableTypes()
{
return this.tableDefs.Select(x => x.ModelType).ToList();
}
}
然后铸造SqlExpression<T>
成SqlExpressionExtension<T>
这样:
var types = ((SqlExpressionExtension<T>)query).GeTableTypes();
但我得到一个异常,它无法转换类型。
获取这些数据的正确方法是什么?
解决方案
您可以使用反射到达现场:
获取类型:
var queryType = query.GetType();
然后获取 FieldInfo:
var tableDefsField = queryType.GetField("tableDefs", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance);
最后得到字段的值:
var tableDefs = (List<ModelDefinition>)tableDefsField.GetValue(query);
但是,就像以这种方式使用反射一样,因为它不是公共的,所以您不能保证这将在 SqlExpression<T> 的未来版本中起作用
推荐阅读
- javascript - Vue - 调度完成后调用存储获取器?
- yocto - 如何强制 bitbake 找到我的库?
- mobile - Flutter listview.separator 项目点击
- objective-c - 将 ClassKit 协议合并到 Objective-C++ 项目中
- c - 有人可以解释一下为什么这里要计算这个模数吗?
- python - 如何正确删除数据框(熊猫)中的列?
- python - 是否可以从 PyQt5 中的线程获取数组?
- xamarin.android - GetView 更新屏幕外的项目
- c++ - 如何清除输入行,而不仅仅是单个字符
- c# - 从对象列表中获取所有对象,其中对象属性之一在 c# 中为空或为空