2015-08-06 12 views
5

Wie verwenden Sie die Reflektion, um auf Eigenschaften von Window Objekten zuzugreifen?C# mit Reflektion für den Zugriff auf Fenstereigenschaften

Hier ist ein minimales Beispiel:

.xaml Datei:

<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> 

Code hinter Datei:

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 ist null (p2 nicht wie erwartet). Wieso ist es so? Ist die Window Art eine spezielle object? Oder liegt es daran, dass der Typ Textbox als internal Feld generiert wird?

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

'TextBox' ist keine Eigenschaft von' Hauptfenster'. Es ist ein Element im Layout hinzugefügt und das war's. Übrigens, was versuchst du zu erreichen? –

+0

warum versuchen Sie, "" Textbox "' aber in generierten 'Test;'? – Grundy

+0

@Grundy hat den Tippfehlercode korrigiert, bevor er zum Beitrag – ubi

Antwort

2

Wie Sie selbst herausgefunden, Textbox ist ein Feld, keine Eigenschaft. Darüber hinaus ist es nicht öffentlich, also sollten Sie Folgendes versuchen:

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

Alle benannten Elemente werden interne Felder, nachdem XAML kompiliert wurde. Dies:

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

verwandelt letztlich dazu:

internal TextBox TextBox; 

Daher zu erhalten Metadaten Sie haben GetField diese Art und Weise zu nennen:

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