<Property> 元素 (.NET Native)

将运行时反射策略应用到一个属性。

语法

<Property Name="property_name"
          Browse="policy_type"
          Dynamic="policy_type"
          Serialize="policy_type" />

特性和元素

下列各节描述了特性、子元素和父元素。

特性

属性 属性类型 说明
Name 常规 必需的特性。 指定属性名称。
Browse 反射 可选特性。 制对该属性信息的查询或列举该属性,但并不在运行时间启用任何动态访问。
Dynamic 反射 可选特性。 控制运行时对该属性的访问,以启用动态编程。 该策略确保一个属性可在运行时间内得到设置或动态检索。
Serialize 序列化 可选特性。 控制运行时对一个属性的访问以启用类型实例,使其通过程序库得到序列化,例如通过 Newtonsoft JSON 序列化程序,或被用于绑定数据。

Name 特性

Value 说明
method_name 属性名称。 该属性的类型是由 <Type><TypeInstantiation> 父元素定义的。

所有其他特性

Value 说明
策略_设置 该设置将应用到这个属性的策略类型。 可能值为 AutoExcludedIncludedRequired。 有关详细信息,请参阅运行时指令策略设置

子元素

无。

父元素

元素 说明
<类型> 将反射策略应用到一种类型及其所有成员。
<TypeInstantiation> 将反射策略应用到一种构造泛型类型及其所有成员。

注解

如果一个属性的策略没有得到显式定义,它将继承其父元素的运行时间策略。

示例

以下实例使用反射实例化了一个 Book 对象并显示了其属性值。 该项目的原始 default.rd.xml 文件显示如下:

<Directives xmlns="http://schemas.microsoft.com/netfx/2013/01/metadata">
   <Application>
      <Namespace Name="LibraryApplications"  Browse="Required Public" >
         <Type Name="Book"   Activate="All" />
      </Namespace>
   </Application>
</Directives>

该文件将 All 值应用到允许通过反射访问类构造函数的 Activate 的类的 Book 策略。 Browse 类的 Book 策略是从其父命名空间继承的。 这已设置为 Required Public,这使得元数据在运行时可用。

以下是该实例的源代码。 outputBlock 变量表示一个 TextBlock 控件。

namespace LibraryApplications
{
   public sealed class Example
   {
      public void Execute()
      {
         TextBlock outputBlock = MainPage.outputBlock;
         Type t = typeof(Book);
         Object obj = Activator.CreateInstance(t, new Object[] { "A Tale of 2 Cities", "Charles Dickens", "" });
         outputBlock.Text += "\n\n\n";
         foreach (var p in t.GetRuntimeProperties())
         {
            outputBlock.Text += String.Format("{0}: {1}\n", p.Name, p.GetValue(obj));
         }
      }
   }

   public class Book
   {
      private string bookTitle = "";
      private string bookAuthor = "";
      private string bookISBN = "";

      public Book(string title, string author, string isbn)
      {
         bookTitle = title;
         bookAuthor = author;
         bookISBN = isbn;
      }

      public string Title
      {
         get { return bookTitle; }
         set { bookTitle = value; }
      }

      public string Author
      {
         get { return bookAuthor; }
         set { bookTitle = value; }
      }

      public string ISBN
      {
         get { return bookISBN; }
      }

      public override string ToString()
      {
         return String.Format("{0}, {1}", Author, Title);
      }
   }
}

public class TextUtilities
{
   public static string ConvertNumberToWord(int value)
   {
      switch (value)
      {
         case 1:
            return "One";
         case 2:
            return "Two";
         case 3:
            return "Three";
         case 4:
            return "Four";
         case 5:
            return "Five";
         case 6:
            return "Six";
         case 7:
            return "Seven";
         case 8:
            return "Eight";
         case 9:
            return "Nine";
         default:
            return value.ToString();
      }
   }
}

然而,编译和执行此示例将引发 MissingRuntimeArtifactException 异常。 尽管我们已经使 Book 类型的元数据变得可用,我们却未使属性获取者的实施变得动态可用。 我们可通过以下方法之一纠正这个错误:

  • 通过在其 <Type> 元素定义 Book 类型的 Dynamic 策略。

  • 通过添加我们想要调用的获取者的每个属性的一个嵌套 <Property> 元素,如以下 default.rd.xml 文件所示。

    <Directives xmlns="http://schemas.microsoft.com/netfx/2013/01/metadata">
       <Application>
          <Namespace Name="LibraryApplications"  Browse="Required Public" >
             <Type Name="Book"   Activate="All" >
                <Property Name="Title" Dynamic="Required" />
                <Property Name="Author" Dynamic="Required" />
                  <Property Name="ISBN" Dynamic="Required" />
             </Type>
          </Namespace>
       </Application>
    </Directives>
    

另请参阅