C# 使用反射访问远程父类中的私有字段返回null

C# 使用反射访问远程父类中的私有字段返回null,c#,reflection,xamarin.forms,C#,Reflection,Xamarin.forms,我正在尝试访问中的\u id的私有字段。它是Xamarin.Forms.Label的远亲 void Handle_Clicked(object sender, System.EventArgs e) { var label = new Label() { Text = "text" }; var element = GetElement(label.GetType()); var field = element.GetField("_id", BindingFlags.I

我正在尝试访问中的
\u id
的私有字段。它是
Xamarin.Forms.Label
的远亲

void Handle_Clicked(object sender, System.EventArgs e)
{
    var label = new Label() { Text = "text" };
    var element = GetElement(label.GetType());
    var field = element.GetField("_id", BindingFlags.Instance | BindingFlags.NonPublic);
    var runtimeFields = element.GetRuntimeFields();
    var runtimeField = runtimeFields.First(f => f.Name == "_id");

    Console.WriteLine("label: " + field.GetValue(label));
    Console.WriteLine("runtime label: " + runtimeField.GetValue(label));
}
我用这个方法得到元素基类型

private Type GetElement(Type type)
{
    if (type.Name != "Element")
    {
        return GetElement(type.BaseType);
    }
    return type;
}
我成功地获得了_id字段和runtimeField-但是调用
GetValue(label)
我得到了null。设置断点并检查时,我可以看到
标签
Xamarin.Forms.Element
BaseType中有一个
\u id
值。但该值不会写入控制台。为什么?


在xaml中创建标签时,我仍然从
\u id
字段中获取空值

<Label Text="text" x:Name="label"/>


当设置断点时,我可以看到
\u id
字段有一个值。

我不确定为什么需要
GetElement(Type)
来获取元素的类型<代码>类型(元素)就可以了。因此,要获取字段,您需要
FieldInfo idField=typeof(Element).GetField(“\u id”,BindingFlags.Instance | BindingFlags.NonPublic)
,要获取其值,请使用
idField.GetValue(label)
。这肯定会给您对象的
\u id


从问题中代码的编写方式来看,我假设您正在处理某个标签的点击事件。我不确定
\u id
字段何时初始化,但它可能只有在添加到父项后才会初始化;您将从刚刚创建的标签中获取
\u id
值,而不是使用
发送方
参数。如果我假定是正确的,您可能希望使用
GetValue(sender)
而不是
GetValue(label)

我知道我认为我必须从对象获取类型。但是我可以直接使用
typeof(Element)
获取类型。我正在研究这个问题:。事件处理程序被分配给一个按钮-仅用于测试。断点检查器本身是否调用get属性
Id
-设置
\u Id
字段?