如何使用反射来访问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");
}
}
p1
为null
(p2
与预期不符)。为什么会这样? Window
类型是某种特殊的object
吗?或者是因为Textbox
的类型是作为internal
字段生成的?
#line 5 "..\..\MainWindow.xaml"
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
internal System.Windows.Controls.TextBox Textbox;
答案 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);