<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 | 说明 |
---|---|
策略_设置 | 该设置将应用到这个属性的策略类型。 可能值为 Auto 、Excluded 、Included 和 Required 。 有关详细信息,请参阅运行时指令策略设置。 |
子元素
无。
父元素
元素 | 说明 |
---|---|
<类型> | 将反射策略应用到一种类型及其所有成员。 |
<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>