c#使用反射来访问窗口属性

本文关键字:访问 窗口 属性 反射 | 更新日期: 2023-09-27 18:06:33

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

下面是一个简单的例子:

.xaml file:

<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");
    }
}

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

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

c#使用反射来访问窗口属性

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

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

最终转化为:

internal TextBox TextBox;

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

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

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

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