C# 使用反射访问 Window 属性

C# using reflection to access Window properties

如何使用反射访问 Window 对象的属性?

这是一个最小的例子:

.xaml 文件:

<Window x:Class="WpfApplication1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow">
    <TextBox x:Name="Textbox" Text=""/>
</Window>

文件背后的代码:

public class A
{
    public int Prop { get; set; }
}

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
        this.Test.Text = "blah";

        PropertyInfo p1 = this.GetType().GetProperty("Textbox");
        PropertyInfo p2 = new A().GetType().GetProperty("Prop");
    }
}

p1nullp2 与预期不符)。为什么会这样? Window 类型是某种特殊的 object 吗?还是因为 Textbox 的类型是作为 internal 字段生成的?

    #line 5 "..\..\MainWindow.xaml"
    [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
    internal System.Windows.Controls.TextBox Textbox;

正如您自己发现的那样,Textbox 是一个字段,而不是 属性。此外,它不是 public,因此您应该尝试以下操作:

FieldInfo f1 = this.GetType().GetField("Textbox", BindingFlags.NonPublic | BindingFlags.Instance);

编译 XAML 后,所有命名元素都成为内部字段。这个:

<TextBox x:Name="Textbox" Text=""/>

最终变成这样:

internal TextBox TextBox;

因此,要获取元数据,您必须这样调用 GetField

GetType().GetField("NameInXaml", BindingFlags.Instance | BindingFlags.NonPublic);