C#使用反射来访问Window属性

ubi*_*ubi 5 c# reflection wpf

如何使用反射来访问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>
Run Code Online (Sandbox Code Playgroud)

代码隐藏文件:

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");
    }
}
Run Code Online (Sandbox Code Playgroud)

p1null(p2不是预期的).为什么会这样?这种Window类型有点特别object吗?或者是因为字段的类型Textbox生成internal

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

Den*_*nis 5

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

<TextBox x:Name="Textbox" Text=""/>
Run Code Online (Sandbox Code Playgroud)

最终转变为:

internal TextBox TextBox;
Run Code Online (Sandbox Code Playgroud)

因此,要获取元数据,您必须以GetField这种方式调用:

GetType().GetField("NameInXaml", BindingFlags.Instance | BindingFlags.NonPublic);
Run Code Online (Sandbox Code Playgroud)


and*_*ask 2

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

FieldInfo f1 = this.GetType().GetField("Textbox", BindingFlags.NonPublic | BindingFlags.Instance);
Run Code Online (Sandbox Code Playgroud)