C# 使用反射访问 Window 属性
C# using reflection to access Window properties
如何使用反射访问 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;
正如您自己发现的那样,Textbox
是一个字段,而不是 属性。此外,它不是 public,因此您应该尝试以下操作:
FieldInfo f1 = this.GetType().GetField("Textbox", BindingFlags.NonPublic | BindingFlags.Instance);
编译 XAML 后,所有命名元素都成为内部字段。这个:
<TextBox x:Name="Textbox" Text=""/>
最终变成这样:
internal TextBox TextBox;
因此,要获取元数据,您必须这样调用 GetField
:
GetType().GetField("NameInXaml", BindingFlags.Instance | BindingFlags.NonPublic);
如何使用反射访问 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;
正如您自己发现的那样,Textbox
是一个字段,而不是 属性。此外,它不是 public,因此您应该尝试以下操作:
FieldInfo f1 = this.GetType().GetField("Textbox", BindingFlags.NonPublic | BindingFlags.Instance);
编译 XAML 后,所有命名元素都成为内部字段。这个:
<TextBox x:Name="Textbox" Text=""/>
最终变成这样:
internal TextBox TextBox;
因此,要获取元数据,您必须这样调用 GetField
:
GetType().GetField("NameInXaml", BindingFlags.Instance | BindingFlags.NonPublic);