如何使用反射来访问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)
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;
Run Code Online (Sandbox Code Playgroud)
在编译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)
正如您自己发现的那样,Textbox它是一个字段,而不是一个属性。此外,它不是公开的,因此您应该尝试以下操作:
FieldInfo f1 = this.GetType().GetField("Textbox", BindingFlags.NonPublic | BindingFlags.Instance);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1522 次 |
| 最近记录: |