首页 > 解决方案 > 获取受保护字段的值

问题描述

我的方法是从第三方代码传递一个对象作为参数。有问题的类称为: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();

但我得到一个异常,它无法转换类型。

获取这些数据的正确方法是什么?

标签: c#

解决方案


您可以使用反射到达现场:

获取类型:

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> 的未来版本中起作用


推荐阅读