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

时间:2015-08-06 06:43:54

标签: c# wpf reflection

如何使用反射来访问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;

2 个答案:

答案 0 :(得分:5)

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

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

最终转变为:

internal TextBox TextBox;

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

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

答案 1 :(得分:2)

当你发现自己时,Textbox是一个字段,而不是一个属性。此外,它不公开,所以你应该尝试以下方法:

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