適用於 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 Store 應用程式使用 .NET 中的反映型別和成員。 這些類型和成員也可用於 (但不是必要) 桌面應用程式,因此您可以對這兩種應用程式使用相同的程式碼。

TypeInfo 和組件載入

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

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

查詢方法

在適用於 Windows 8.x 市集應用程式的 .NET中,請使用會傳回 IEnumerable<T> 集合的反映屬性,而不要使用傳回陣列的方法。 反映內容可以針對大型組件或類型實作這些集合的消極式周遊。

反映屬性只傳回特定物件上宣告的方法,而不會周遊繼承樹狀結構。 此外,它們不會使用 BindingFlags 參數進行篩選。 相反地,篩選發生在使用者程式碼中,對傳回的集合使用 LINQ 查詢。 對於因執行階段而產生的反映物件 (例如,因為 typeof(Object)),周遊繼承樹狀結構最佳的執行方式是使用 RuntimeReflectionExtensions 類別的 helper 方法。 來自自訂反映內容之物件的取用者不能使用這些方法,而且必須自行周遊繼承樹狀結構。

限制

在 Windows 8.x 市集應用程式中,對於某些 .NET Framework 型別和成員的存取會受到限制。 例如,您無法藉由使用 MethodInfo 物件,呼叫適用於 Windows 8.x 市集應用程式的 .NET 中未包含的 .NET Framework 方法。 此外,在 Windows 8.x 市集應用程式的內容中不被視為安全的特定類型和成員會遭封鎖,就如同 MarshalWindowsRuntimeMarshal 成員一樣。 這項限制只會影響 .NET Framework 類型和成員;您可以如常呼叫您的程式碼或協力廠商程式碼。

範例

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

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

另請參閱