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