共用方式為


適用於 Windows 市集應用程式的 .NET Framework 反射

從 .NET Framework 4.5 開始,.NET Framework 包含一組反映類型和成員,以用於 Windows 8.x 市集應用程式。 這些類型和成員可在完整的 .NET Framework 以及適用於 Windows 市集應用程式的 .NET 中使用。 本文件說明 .NET Framework 4 和舊版中這些和其對應專案之間的主要差異。

如果您要建立 Windows 8.x 市集應用程式,則必須使用適用於 Windows 8.x 市集應用程式的 .NET 中的反映類型和成員。 這些類型和成員也可供在傳統型應用程式中使用,但並非必要,因此您可以針對這兩種類型的應用程式使用相同的程序代碼。

TypeInfo 和組件載入

在適用於 Windows 8.x 市集應用程式的 .NET 中,類別 TypeInfo 包含 .NET Framework 4 Type 類別的一些功能。 Type物件代表型別定義的參考,而 TypeInfo 物件則代表型別定義本身。 這可讓您操作 Type 物件,而不需要在執行階段載入它們引用的組件。 取得相關聯的 TypeInfo 物件會強制載入組件。

TypeInfo 包含 Type 上可用的許多成員,而在適用於 Windows 8.x 市集應用程式的 .NET 中,許多反映屬性會傳回 TypeInfo 物件的集合。 若要從 TypeInfo 物件取得 Type 物件,請使用 GetTypeInfo 方法。

查詢方法

在適用於 Windows 8.x 市集應用程式的 .NET 中,您應使用傳回 IEnumerable<T> 集合的反射屬性,而不是使用傳回陣列的方法。 反射上下文可以對於大型元件或類型實作這些集合的延遲遍歷。

反射特性只會返回特定對象上宣告的方法,而不是遍歷繼承樹狀結構。 此外,它們不會使用 BindingFlags 參數進行篩選。 相反地,篩選會在使用者程式代碼中進行,方法是在傳回的集合上使用LINQ查詢。 對於源自執行階段的反映物件(例如,結果 typeof(Object)),遍歷繼承樹狀結構最佳達成的方法是使用 RuntimeReflectionExtensions 類別的輔助方法。 來自自定義反射上下文的物件使用者無法使用這些方法,必須自行遍歷繼承樹。

限制

在 Windows 8.x 市集應用程式中,某些 .NET Framework 類型和成員的存取受到限制。 例如,您無法使用 MethodInfo 物件呼叫 .NET For Windows 8.x 市集應用程式中未包含的 .NET Framework 方法。 此外,某些在 Windows 8.x 市集應用程式中不被視為安全的類型和成員,以及被標示為 MarshalWindowsRuntimeMarshal 的成員,均遭到封鎖。 此限制只會影響 .NET Framework 類型和成員;您可以像平常一樣呼叫程式代碼或第三方程序代碼。

範例

這個範例會使用適用於 Windows 8.x 市集應用程式的 .NET 中的反射類型和成員,來擷取 Calendar 型別的方法和屬性,包括繼承的方法和屬性。 若要執行此程式代碼,請將它貼到一個專案名稱為 Reflection 的 Windows 8.x 市集頁面程式代碼檔案中,其中包含名為 Windows.UI.Xaml.Controls.TextBlock 的控件 textblock1。 如果您將此程式代碼貼到具有不同名稱的專案內,只要確定您變更命名空間名稱以符合您的專案即可。

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

另請參閱