2015-08-06 18 views
5

Jak korzystać z odbicia, aby uzyskać dostęp do właściwości obiektów Window?C# za pomocą odbicia, aby uzyskać dostęp do właściwości okna

Oto minimalne przykład:

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

kod związany z pliku:

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 jest null (p2 nie jest zgodnie z oczekiwaniami). Dlaczego tak jest? Czy Window jest rodzajem specjalnego object? A może dlatego, że typ Textbox jest generowany jako pole internal?

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

'TextBox' nie jest własnością' MainWindow'. Jest to element dodany w układzie i to wszystko. Btw co próbujesz osiągnąć? –

+0

dlaczego próbujesz pobrać '" Textbox "', ale w wygenerowanym 'Test;'? – Grundy

+0

@Grundy poprawiono kod edytowany literami przed dodaniem do posta – ubi

Odpowiedz

2

Jak się dowiedziałeś, Textbox jest polem, a nie właściwością. Ponadto nie jest to publiczne, więc powinieneś wypróbować następujące:

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

Wszystkie nazwane elementy stają się polami wewnętrznymi, po kompilacji XAML. To:

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

ostatecznie przekształca się w ten sposób:

internal TextBox TextBox; 

Stąd, w celu uzyskania metadanych trzeba zadzwonić GetField w ten sposób:

GetType().GetField("NameInXaml", BindingFlags.Instance | BindingFlags.NonPublic); 
Powiązane problemy