获取通用继承私有字段的值

时间:2021-03-25 21:19:58

标签: c# reflection

我在尝试从继承的泛型类访问私有字段时遇到了一些问题。它向我抛出一个异常,我正在使用对象所有者尝试获取该值,但是如果我使用同一个所有者从使用该泛型类型直接声明的字段中获取该字段,则它可以正常工作。

这是我的字段:

discount

以下是我从 m_nonIngeriteedBool 字段中获取值的方法:

public class Bool : DebugProperty<bool>
{
    ...
}

DebugProperty<bool> m_nonIngeriteedBool;
Bool m_inheritedBool;

这工作正常并返回正确的值,但对于 m_inheritedBool 我找不到如何使它工作。这是我目前拥有的:

FieldInfo field = owner.GetType().GetField(name, BindingFlags.Public | BindingFlags.Instance | BindingFlags.NonPublic);

Type type = field.FieldType;

FieldInfo m_value = type.GetField("m_value", BindingFlags.Instance | BindingFlags.NonPublic);

object val = m_value.GetValue(field.GetValue(owner)).ToString();

这将返回正确的 m_value 字段,但在尝试获取该值时失败并抛出以下错误:

FieldInfo field = owner.GetType().GetField(name, BindingFlags.Public | BindingFlags.Instance | BindingFlags.NonPublic);

Type type = field.FieldType;

while (type != typeof(DebugProperty<>))
{
    type = type.BaseType;

    if (type.IsGenericType)
        type = type.GetGenericTypeDefinition();
    
    if (type == null)
        break;
}

FieldInfo m_value = type.GetField("m_value", BindingFlags.Instance | BindingFlags.NonPublic);

object val = m_value.GetValue(field.GetValue(owner)).ToString();

我应该使用什么对象来返回正确的值?

1 个答案:

答案 0 :(得分:0)

在玩了更多之后,我找到了让它工作的方法。这种方法适用于两种情况,没有问题。这要归功于@madreflection 评论。

static object GetValue(object owner, string name)
{
    FieldInfo field = owner.GetType().GetField(name, BindingFlags.Public | BindingFlags.Instance | BindingFlags.NonPublic);

    Type type = field.FieldType;

    if (!type.IsGenericType || type.GetGenericTypeDefinition() != typeof(DebugProperty<>))
    {
        do
        {
            type = type.BaseType;
            
            if (type == null)
                return null;

        } while (type.GetGenericTypeDefinition() != typeof(DebugProperty<>));
    }

    FieldInfo m_value = type.GetField("m_value", BindingFlags.Instance | BindingFlags.NonPublic);

    object fieldVal = field.GetValue(owner);
    object val = m_value.GetValue(fieldVal).ToString();

    return val;
}
相关问题