<Элемент Type (.NET Native)>
Применяет политику выполнения для конкретного типа, например класса или структуры.
Синтаксис
<Type Name="type_name"
Activate="policy_type"
Browse="policy_type"
Dynamic="policy_type"
Serialize="policy_type"
DataContractSerializer="policy_setting"
DataContractJsonSerializer="policy_setting"
XmlSerializer="policy_setting"
MarshalObject="policy_setting"
MarshalDelegate="policy_setting"
MarshalStructure="policy_setting" />
Атрибуты и элементы
В следующих разделах описаны атрибуты, дочерние и родительские элементы.
Атрибуты
Атрибут | Тип атрибута | Description |
---|---|---|
Name |
Общие | Обязательный атрибут элемента . Указывает имя типа. |
Activate |
Отражение | Необязательный атрибут элемента . Управляет доступом среды выполнения к конструкторам для включения активации экземпляров. |
Browse |
Отражение | Необязательный атрибут элемента . Управляет запросами для получения сведений об элементах программы, но не включает доступ среды выполнения. |
Dynamic |
Отражение | Необязательный атрибут элемента . Управляет доступом среды выполнения ко всем членам типа, включая конструкторы, методы, поля, свойства и события, чтобы включить динамическое программирование. |
Serialize |
Сериализация | Необязательный атрибут элемента . Управляет доступом среды выполнения к конструкторам, полям и свойствам, позволяющим сериализовать и десериализовать экземпляры типа с помощью таких библиотек, как, например, сериализатор Newtonsoft JSON. |
DataContractSerializer |
Сериализация | Необязательный атрибут элемента . Определяет политику для сериализации, в которой используется класс System.Runtime.Serialization.DataContractSerializer. |
DataContractJsonSerializer |
Сериализация | Необязательный атрибут элемента . Определяет политику для сериализации JSON, в которой используется класс System.Runtime.Serialization.Json.DataContractJsonSerializer. |
XmlSerializer |
Сериализация | Необязательный атрибут элемента . Определяет политику для сериализации XML, в которой используется класс System.Xml.Serialization.XmlSerializer. |
MarshalObject |
Interop | Необязательный атрибут элемента . Определяет политику для маршалинга ссылочных типов в среды выполнения Windows и COM. |
MarshalDelegate |
Interop | Необязательный атрибут элемента . Определяет политики для маршалинга типов делегатов как указателей функции на машинный код. |
MarshalStructure |
Interop | Необязательный атрибут элемента . Определяет политики для маршалинга типов значений в машинный код. |
Name - атрибут
значение | Описание |
---|---|
type_name | Имя типа. Если этот <Type> элемент является дочерним элементом элемента пространства> имен или другим <Type> элементом<, type_name может включать имя типа без его пространства имен. В противном случае атрибут type_name должен содержать полное имя типа. |
Все остальные атрибуты
значение | Описание |
---|---|
policy_setting | Параметр, применяемый для этого типа политики. Допустимые значения All , Auto , Excluded , Public , PublicAndInternal , Required Public , Required PublicAndInternal и Required All . Дополнительные сведения см. в разделе Параметры политики директив среды выполнения. |
Дочерние элементы
Элемент | Description |
---|---|
<AttributeImplies> | Если содержащий тип является атрибутом, определяет политику выполнения для элементов кода, к которым применяется этот атрибут. |
<Событие> | Применяет политику отражения события, относящегося к этому типу. |
<Поле> | Применяет политику отражения поля, относящегося к этому типу. |
<GenericParameter> | Применяет политику к типу параметра универсального типа. |
<ImpliesType> | Применяет политику к типу, если политика была применена для типа, представленного содержащим элементом <Type> . |
<Method> | Применяет политику отражения метода, относящегося к этому типу. |
<MethodInstantiation> | Применяет политику отражения к сконструированному универсальному методу, относящемуся к этому типу. |
<Свойство> | Применяет политику отражения к свойству, относящемуся к этому типу. |
<Подтипов> | Применяет политику среды выполнения для всех классов, унаследованных из содержащего типа. |
<Type> |
Применяет политику отражения к вложенному типу. |
<TypeInstantiation> | Применяет политику отражения к сконструированному универсальному типу. |
Родительские элементы
Элемент | Description |
---|---|
<Приложение> | Служит в качестве контейнера для типов и членов типов приложения, метаданные которого доступны для отражения во время выполнения. |
<Сборка> | Применяет политику отражения ко всем типам в указанной сборке. |
<Библиотека> | Определяет сборку, содержащую типы и члены типов, метаданные которой доступны для отражения во время выполнения. |
<Пространство имен> | Применяет политику отражения ко всем типам в пространстве имен. |
<Type> |
Применяет политику отражения к типу и всем его членам. |
<TypeInstantiation> | Применяет политику отражения к сконструированному универсальному типу и всем его членам. |
Замечания
Атрибуты отражения, сериализации и взаимодействия являются необязательными. Если таковые отсутствуют, элемент <Type>
служит в качестве контейнера, чьи дочерние типы определяют политику для отдельных элементов.
<Type>
Если элемент является дочерним элементом< элемента Assembly>, <Namespace><Type>
или< TypeInstantiation>, он переопределяет параметры политики, определенные родительским элементом.
Элемент <Type>
универсального типа применяет свою политику для всех экземпляров, которые не имеют собственной политики. Политика созданных универсальных типов определяется элементом <TypeInstantiation> .
Если тип является универсальным типом, его имя декорируется серьезным символом акцента (') и его числом универсальных параметров. Например, атрибут Name
элемента <Type>
для класса System.Collections.Generic.List<T> отображается как Name="System.Collections.Generic.List`1"
.
Пример 1
В следующем примере отражение используется для отображения сведений о полях, свойствах и методах класса System.Collections.Generic.List<T>. Переменная b
в примере — TextBlock это элемент управления. Так как просто извлекаются сведения о типе, доступность метаданных определяется параметром политики Browse
.
public static void GetReflectionInfo()
{
Type t = typeof(List<>);
b.Text += String.Format("Type information for {0}\n", t);
// Get fields.
b.Text += "\nFields:\n";
var fields = t.GetTypeInfo().DeclaredFields;
int nFields = 0;
foreach (var field in fields)
{
b.Text += String.Format(" {0} ({1})", field.Name, field.FieldType.Name);
nFields++;
}
if (nFields == 0) b.Text += " None\n";
// Get properties.
b.Text += "\nProperties:\n";
var props = t.GetTypeInfo().DeclaredProperties;
int nProps = 0;
foreach (var prop in props)
{
b.Text += String.Format(" {0} ({1})\n", prop.Name, prop.PropertyType.Name);
nProps++;
}
if (nProps == 0) b.Text += " None\n";
// Get methods.
b.Text += "\nMethods:\n";
var methods = t.GetTypeInfo().DeclaredMethods;
int nMethods = 0;
foreach (var method in methods)
{
if (method.IsSpecialName) continue;
b.Text += String.Format(" {0}({1}) ({2})\n", method.Name,
GetSignature(method), method.ReturnType.Name);
nMethods++;
}
if (nMethods == 0) b.Text += " None\n";
}
private static string GetSignature(MethodInfo m)
{
string signature = null;
var parameters = m.GetParameters();
for (int ctr = 0; ctr < parameters.Length; ctr++)
{
signature += String.Format("{0} {1}", parameters[ctr].ParameterType.Name,
parameters[ctr].Name);
if (ctr < parameters.Length - 1) signature += ", ";
}
return signature;
}
Так как метаданные для List<T> класса не включаются в цепочку инструментов .NET Native, пример не отображает запрошенные сведения о членах во время выполнения. Для обеспечения необходимыми метаданными, добавьте следующий элемент <Type>
в файл директивы среды выполнения. Обратите внимание, что, так как мы предоставили родительский <элемент пространства> имен, нам не нужно указать полное имя типа в элементе<Type>
.
<Directives xmlns="http://schemas.microsoft.com/netfx/2013/01/metadata">
<Application>
<Assembly Name="*Application*" Dynamic="Required All" />
<Namespace Name ="System.Collections.Generic" >
<Type Name="List`1" Browse="Required All" />
</Namespace>
</Application>
</Directives>
Пример 2
В следующем примере отражение используется для получения объекта PropertyInfo, представляющего свойство String.Chars[]. Затем он использует метод PropertyInfo.GetValue(Object, Object[]) для извлечения значения седьмого знака в строке и для отображения всех символов в строке. Переменная b
в примере — TextBlock это элемент управления.
public void Example()
{
string test = "abcdefghijklmnopqrstuvwxyz";
// Get a PropertyInfo object.
TypeInfo ti = typeof(string).GetTypeInfo();
PropertyInfo pinfo = ti.GetDeclaredProperty("Chars");
// Show the seventh letter ('g')
object[] indexArgs = { 6 };
object value = pinfo.GetValue(test, indexArgs);
b.Text += String.Format("Character at position {0}: {1}\n", indexArgs[0], value);
// Show the complete string.
b.Text += "\nThe complete string:\n";
for (int x = 0; x < test.Length; x++)
{
b.Text += pinfo.GetValue(test, new Object[] {x}).ToString() + " ";
}
}
// The example displays the following output:
// Character at position 6: g
//
// The complete string:
// a b c d e f g h i j k l m n o p q r s t u v w x y z
Так как метаданные для String объекта недоступны, вызов PropertyInfo.GetValue(Object, Object[]) метода вызывает NullReferenceException исключение во время выполнения при компиляции с цепочкой инструментов .NET Native. Чтобы избежать исключений и предоставить необходимые метаданные, добавьте следующий элемент <Type>
элемент в файл директив среды выполнения:
<Directives xmlns="http://schemas.microsoft.com/netfx/2013/01/metadata">
<Application>
<Assembly Name="*Application*" Dynamic="Required All" />
<Type Name="System.String" Dynamic="Required Public"/> -->
</Application>
</Directives>