|
|
@@ -154,6 +154,153 @@ internal sealed class UnconditionalSuppressMessageAttribute : Attribute
|
|
|
public string? Justification { get; set; }
|
|
|
}
|
|
|
|
|
|
+/// <summary>
|
|
|
+/// States a dependency that one member has on another.
|
|
|
+/// </summary>
|
|
|
+/// <remarks>
|
|
|
+/// This can be used to inform tooling of a dependency that is otherwise not evident purely from
|
|
|
+/// metadata and IL, for example a member relied on via reflection.
|
|
|
+/// </remarks>
|
|
|
+[AttributeUsage(
|
|
|
+ AttributeTargets.Constructor | AttributeTargets.Field | AttributeTargets.Method,
|
|
|
+ AllowMultiple = true, Inherited = false)]
|
|
|
+internal sealed class DynamicDependencyAttribute : Attribute
|
|
|
+{
|
|
|
+ /// <summary>
|
|
|
+ /// Initializes a new instance of the <see cref="DynamicDependencyAttribute"/> class
|
|
|
+ /// with the specified signature of a member on the same type as the consumer.
|
|
|
+ /// </summary>
|
|
|
+ /// <param name="memberSignature">The signature of the member depended on.</param>
|
|
|
+ public DynamicDependencyAttribute(string memberSignature)
|
|
|
+ {
|
|
|
+ MemberSignature = memberSignature;
|
|
|
+ }
|
|
|
+
|
|
|
+ /// <summary>
|
|
|
+ /// Initializes a new instance of the <see cref="DynamicDependencyAttribute"/> class
|
|
|
+ /// with the specified signature of a member on a <see cref="System.Type"/>.
|
|
|
+ /// </summary>
|
|
|
+ /// <param name="memberSignature">The signature of the member depended on.</param>
|
|
|
+ /// <param name="type">The <see cref="System.Type"/> containing <paramref name="memberSignature"/>.</param>
|
|
|
+ public DynamicDependencyAttribute(string memberSignature, Type type)
|
|
|
+ {
|
|
|
+ MemberSignature = memberSignature;
|
|
|
+ Type = type;
|
|
|
+ }
|
|
|
+
|
|
|
+ /// <summary>
|
|
|
+ /// Initializes a new instance of the <see cref="DynamicDependencyAttribute"/> class
|
|
|
+ /// with the specified signature of a member on a type in an assembly.
|
|
|
+ /// </summary>
|
|
|
+ /// <param name="memberSignature">The signature of the member depended on.</param>
|
|
|
+ /// <param name="typeName">The full name of the type containing the specified member.</param>
|
|
|
+ /// <param name="assemblyName">The assembly name of the type containing the specified member.</param>
|
|
|
+ public DynamicDependencyAttribute(string memberSignature, string typeName, string assemblyName)
|
|
|
+ {
|
|
|
+ MemberSignature = memberSignature;
|
|
|
+ TypeName = typeName;
|
|
|
+ AssemblyName = assemblyName;
|
|
|
+ }
|
|
|
+
|
|
|
+ /// <summary>
|
|
|
+ /// Initializes a new instance of the <see cref="DynamicDependencyAttribute"/> class
|
|
|
+ /// with the specified types of members on a <see cref="System.Type"/>.
|
|
|
+ /// </summary>
|
|
|
+ /// <param name="memberTypes">The types of members depended on.</param>
|
|
|
+ /// <param name="type">The <see cref="System.Type"/> containing the specified members.</param>
|
|
|
+ public DynamicDependencyAttribute(DynamicallyAccessedMemberTypes memberTypes, Type type)
|
|
|
+ {
|
|
|
+ MemberTypes = memberTypes;
|
|
|
+ Type = type;
|
|
|
+ }
|
|
|
+
|
|
|
+ /// <summary>
|
|
|
+ /// Initializes a new instance of the <see cref="DynamicDependencyAttribute"/> class
|
|
|
+ /// with the specified types of members on a type in an assembly.
|
|
|
+ /// </summary>
|
|
|
+ /// <param name="memberTypes">The types of members depended on.</param>
|
|
|
+ /// <param name="typeName">The full name of the type containing the specified members.</param>
|
|
|
+ /// <param name="assemblyName">The assembly name of the type containing the specified members.</param>
|
|
|
+ public DynamicDependencyAttribute(DynamicallyAccessedMemberTypes memberTypes, string typeName, string assemblyName)
|
|
|
+ {
|
|
|
+ MemberTypes = memberTypes;
|
|
|
+ TypeName = typeName;
|
|
|
+ AssemblyName = assemblyName;
|
|
|
+ }
|
|
|
+
|
|
|
+ /// <summary>
|
|
|
+ /// Gets the signature of the member depended on.
|
|
|
+ /// </summary>
|
|
|
+ /// <remarks>
|
|
|
+ /// Either <see cref="MemberSignature"/> must be a valid string or <see cref="MemberTypes"/>
|
|
|
+ /// must not equal <see cref="DynamicallyAccessedMemberTypes.None"/>, but not both.
|
|
|
+ /// </remarks>
|
|
|
+ public string? MemberSignature { get; }
|
|
|
+
|
|
|
+ /// <summary>
|
|
|
+ /// Gets the <see cref="DynamicallyAccessedMemberTypes"/> which specifies the type
|
|
|
+ /// of members depended on.
|
|
|
+ /// </summary>
|
|
|
+ /// <remarks>
|
|
|
+ /// Either <see cref="MemberSignature"/> must be a valid string or <see cref="MemberTypes"/>
|
|
|
+ /// must not equal <see cref="DynamicallyAccessedMemberTypes.None"/>, but not both.
|
|
|
+ /// </remarks>
|
|
|
+ public DynamicallyAccessedMemberTypes MemberTypes { get; }
|
|
|
+
|
|
|
+ /// <summary>
|
|
|
+ /// Gets the <see cref="System.Type"/> containing the specified member.
|
|
|
+ /// </summary>
|
|
|
+ /// <remarks>
|
|
|
+ /// If neither <see cref="Type"/> nor <see cref="TypeName"/> are specified,
|
|
|
+ /// the type of the consumer is assumed.
|
|
|
+ /// </remarks>
|
|
|
+ public Type? Type { get; }
|
|
|
+
|
|
|
+ /// <summary>
|
|
|
+ /// Gets the full name of the type containing the specified member.
|
|
|
+ /// </summary>
|
|
|
+ /// <remarks>
|
|
|
+ /// If neither <see cref="Type"/> nor <see cref="TypeName"/> are specified,
|
|
|
+ /// the type of the consumer is assumed.
|
|
|
+ /// </remarks>
|
|
|
+ public string? TypeName { get; }
|
|
|
+
|
|
|
+ /// <summary>
|
|
|
+ /// Gets the assembly name of the specified type.
|
|
|
+ /// </summary>
|
|
|
+ /// <remarks>
|
|
|
+ /// <see cref="AssemblyName"/> is only valid when <see cref="TypeName"/> is specified.
|
|
|
+ /// </remarks>
|
|
|
+ public string? AssemblyName { get; }
|
|
|
+
|
|
|
+ /// <summary>
|
|
|
+ /// Gets or sets the condition in which the dependency is applicable, e.g. "DEBUG".
|
|
|
+ /// </summary>
|
|
|
+ public string? Condition { get; set; }
|
|
|
+}
|
|
|
+
|
|
|
+/// <summary>
|
|
|
+/// Indicates that certain members on a specified <see cref="Type"/> are accessed dynamically,
|
|
|
+/// for example through <see cref="System.Reflection"/>.
|
|
|
+/// </summary>
|
|
|
+/// <remarks>
|
|
|
+/// This allows tools to understand which members are being accessed during the execution
|
|
|
+/// of a program.
|
|
|
+///
|
|
|
+/// This attribute is valid on members whose type is <see cref="Type"/> or <see cref="string"/>.
|
|
|
+///
|
|
|
+/// When this attribute is applied to a location of type <see cref="string"/>, the assumption is
|
|
|
+/// that the string represents a fully qualified type name.
|
|
|
+///
|
|
|
+/// When this attribute is applied to a class, interface, or struct, the members specified
|
|
|
+/// can be accessed dynamically on <see cref="Type"/> instances returned from calling
|
|
|
+/// <see cref="object.GetType"/> on instances of that class, interface, or struct.
|
|
|
+///
|
|
|
+/// If the attribute is applied to a method it's treated as a special case and it implies
|
|
|
+/// the attribute should be applied to the "this" parameter of the method. As such the attribute
|
|
|
+/// should only be used on instance methods of types assignable to System.Type (or string, but no methods
|
|
|
+/// will use it there).
|
|
|
+/// </remarks>
|
|
|
[AttributeUsage(
|
|
|
AttributeTargets.Field | AttributeTargets.ReturnValue | AttributeTargets.GenericParameter |
|
|
|
AttributeTargets.Parameter | AttributeTargets.Property | AttributeTargets.Method |
|