/
ConfigurationValidatorAttribute.cs
59 lines (49 loc) · 2.19 KB
/
ConfigurationValidatorAttribute.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
using System.Diagnostics;
namespace System.Configuration
{
[AttributeUsage(AttributeTargets.Property)]
public class ConfigurationValidatorAttribute : Attribute
{
internal Type _declaringType;
protected ConfigurationValidatorAttribute() { }
public ConfigurationValidatorAttribute(Type validator)
{
if (validator == null) throw new ArgumentNullException(nameof(validator));
if (!typeof(ConfigurationValidatorBase).IsAssignableFrom(validator))
{
throw new ArgumentException(SR.Format(SR.Validator_Attribute_param_not_validator,
"ConfigurationValidatorBase"));
}
ValidatorType = validator;
}
public virtual ConfigurationValidatorBase ValidatorInstance
=> (ConfigurationValidatorBase)TypeUtil.CreateInstance(ValidatorType);
public Type ValidatorType { get; }
// Used for limiting the visibility of types that can be accessed in the reflection
// call made by the ValidatorInstance property getter. This will normally be the
// type that declared the attribute, but in certain cases it could be a subclass
// of the type that declared the attribute. This should be ok from a security
// perspective, as one wouldn't reasonably expect a derived type to have fewer
// security constraints than its base type.
internal void SetDeclaringType(Type declaringType)
{
if (declaringType == null)
{
Debug.Fail("Declaring type must not be null.");
return; // don't throw in an in-place update
}
if (_declaringType == null)
{
// First call to this method - allow any type to be set
_declaringType = declaringType;
}
else
{
Debug.Assert(_declaringType == declaringType,
"Subsequent calls cannot change the declaring type of the attribute.");
}
}
}
}