2015-08-06 6 views
5

Come si utilizza la riflessione per accedere alle proprietà degli oggetti Window?C# utilizzando la riflessione per accedere alle proprietà della finestra

Ecco un esempio minimo:

.xaml di 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> 

codice al file:

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 non è come previsto). Perché è così? Il tipo Window è una specie di speciale object? Oppure perché il tipo di Textbox viene generato come un campo internal?

#line 5 "..\..\MainWindow.xaml" 
    [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] 
    internal System.Windows.Controls.TextBox Textbox; 
+0

'TextBox' non è una proprietà di' MainWindow'. È un elemento aggiunto nel layout e basta. A proposito, cosa stai cercando di ottenere? –

+0

perché provi a ottenere "" Textbox "' ma nel generato 'Test;'? – Grundy

+0

@Grundy ha corretto il codice typo - modificato prima di aggiungere al post – ubi

risposta

2

Come hai scoperto da soli, Textbox è un campo, non una proprietà. Inoltre, non è pubblica, quindi si dovrebbe provare il seguente:

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

Tutti gli elementi chiamati diventano campi interni, dopo XAML viene compilato. Questo:

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

in ultima analisi, si trasforma a questo:

internal TextBox TextBox; 

Quindi, per ottenere i metadati si deve chiamare GetField questo modo:

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