Reflection in .NET Framework per app Windows Store
A partire da .NET Framework 4.5, .NET Framework include un set di tipi di reflection e membri da usare nelle app di Windows 8.x Store. Questi tipi e membri sono disponibili nella versione completa di .NET Framework, nonché in .NET per app di Windows Store. In questo documento vengono illustrate le differenze principali tra questi e le relative controparti in .NET Framework 4 e versioni precedenti.
Se stai creando un'app di Windows 8.x Store, devi usare i tipi di reflection e i membri nelle app .NET per Windows 8.x Store. Questi tipi e membri sono anche disponibili, ma non obbligatori, per l'utilizzo nelle applicazioni desktop, pertanto è possibile utilizzare lo stesso codice per entrambi i tipi di applicazioni.
Caricamento di assembly e TypeInfo
In .NET per le app di Windows 8.x Store la TypeInfo classe contiene alcune delle funzionalità della classe .NET Framework 4 Type . Un oggetto Type rappresenta un riferimento a una definizione di tipo, mentre un oggetto TypeInfo rappresenta la definizione del tipo stesso. Ciò consente di modificare gli oggetti Type senza richiedere necessariamente al runtime di caricare l'assembly a cui fanno riferimento. L'acquisizione dell'oggetto TypeInfo associato comporta il caricamento dell'assembly.
TypeInfo contiene molti dei membri disponibili in Typee molte delle proprietà di reflection in .NET per le app di Windows 8.x Store restituiscono raccolte di TypeInfo oggetti. Per ottenere un oggetto TypeInfo da un oggetto Type, utilizzare il metodo GetTypeInfo.
Metodi di query
Nelle app .NET per Windows 8.x Store si usano le proprietà di reflection che restituiscono raccolte anziché metodi che restituiscono IEnumerable<T> matrici. Nei contesti di reflection è possibile implementare l'attraversamento lazy di queste raccolte in caso di assembly o tipi di grandi dimensioni.
Tramite le proprietà di reflection vengono restituiti solo i metodi dichiarati in un oggetto particolare invece di attraversare l'albero di ereditarietà. Inoltre, non vengono utilizzati i parametri BindingFlags per l'applicazione di filtri. Al contrario, i filtri vengono applicati al codice utente, utilizzando le query LINQ nelle raccolte restituite. Per gli oggetti di reflection generati con il runtime (ad esempio come risultato di typeof(Object)
), l'attraversamento dell'albero di ereditarietà viene eseguito in modo migliore se si utilizzano i metodi helper della classe RuntimeReflectionExtensions. Nei consumer di oggetti derivanti da contesti di reflection personalizzati non possono essere utilizzati questi metodi e l'attraversamento dell'albero di ereditarietà deve essere eseguito in modo autonomo.
Restrizioni
In un'app di Windows 8.x Store, l'accesso ad alcuni tipi e membri di .NET Framework è limitato. Ad esempio, non è possibile chiamare metodi .NET Framework non inclusi in .NET per le app di Windows 8.x Store usando un MethodInfo oggetto . Inoltre, alcuni tipi e membri non considerati sicuri all'interno del contesto di un'app di Windows 8.x Store vengono bloccati, come sono Marshal e WindowsRuntimeMarshal membri. Questa restrizione influisce solo sui tipi e sui membri di .NET Framework; il proprio codice o quello di terze parti può essere chiamato normalmente.
Esempio
Questo esempio usa i tipi di reflection e i membri nelle app .NET per Windows 8.x Store per recuperare i metodi e le proprietà del Calendar tipo, inclusi metodi e proprietà ereditati. Per eseguire questo codice, incollarlo nel file di codice per una pagina di Windows 8.x Store contenente un Windows.UI.Xaml.Controls.TextBlock controllo denominato textblock1
in un progetto denominato Reflection. Se si incolla il codice nel progetto con un nome diverso, assicurarsi di modificare il nome dello spazio dei nomi affinché corrisponda al progetto.
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml.Controls.Primitives;
using Windows.UI.Xaml.Navigation;
using System.Reflection;
using System.Globalization;
using System.Text;
namespace Reflection
{
public sealed partial class MainPage : Page
{
public MainPage()
{
this.InitializeComponent();
}
protected override void OnNavigatedTo(NavigationEventArgs e)
{
TypeInfo t = typeof(Calendar).GetTypeInfo();
IEnumerable<PropertyInfo> pList = t.DeclaredProperties;
IEnumerable<MethodInfo> mList = t.DeclaredMethods;
StringBuilder sb = new StringBuilder();
sb.Append("Properties:");
foreach (PropertyInfo p in pList)
{
sb.Append("\n" + p.DeclaringType.Name + ": " + p.Name);
}
sb.Append("\nMethods:");
foreach (MethodInfo m in mList)
{
sb.Append("\n" + m.DeclaringType.Name + ": " + m.Name);
}
textblock1.Text = sb.ToString();
}
}
}
Imports Windows.UI.Xaml.Navigation
Imports System.Reflection
Imports System.Globalization
Imports System.Text
Public NotInheritable Class MainPage
Inherits Page
Protected Overrides Sub OnNavigatedTo(e As NavigationEventArgs)
Dim t As TypeInfo = GetType(Calendar).GetTypeInfo()
Dim pList As IEnumerable(Of PropertyInfo) = t.DeclaredProperties
Dim mList As IEnumerable(Of MethodInfo) = t.DeclaredMethods
Dim sb As New StringBuilder()
sb.Append("Properties:")
For Each p As PropertyInfo In pList
sb.Append((vbLf + p.DeclaringType.Name & ": ") + p.Name)
Next
sb.Append(vbLf & "Methods:")
For Each m As MethodInfo In mList
sb.Append((vbLf + m.DeclaringType.Name & ": ") + m.Name)
Next
textblock1.Text = sb.ToString()
End Sub
End Class