forked from aspnet/AspNetWebStack
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathHttpParameterDescriptor.cs
More file actions
162 lines (141 loc) · 5.2 KB
/
Copy pathHttpParameterDescriptor.cs
File metadata and controls
162 lines (141 loc) · 5.2 KB
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
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
// Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Web.Http.Internal;
using System.Web.Http.ModelBinding;
using System.Web.Http.Properties;
namespace System.Web.Http.Controllers
{
public abstract class HttpParameterDescriptor
{
private readonly ConcurrentDictionary<object, object> _properties = new ConcurrentDictionary<object, object>();
private ParameterBindingAttribute _parameterBindingAttribute;
private bool _searchedModelBinderAttribute;
private HttpConfiguration _configuration;
private HttpActionDescriptor _actionDescriptor;
protected HttpParameterDescriptor()
{
}
protected HttpParameterDescriptor(HttpActionDescriptor actionDescriptor)
{
if (actionDescriptor == null)
{
throw Error.ArgumentNull("actionDescriptor");
}
_actionDescriptor = actionDescriptor;
_configuration = _actionDescriptor.Configuration;
}
public HttpConfiguration Configuration
{
get { return _configuration; }
set
{
if (value == null)
{
throw Error.PropertyNull();
}
_configuration = value;
}
}
public HttpActionDescriptor ActionDescriptor
{
get { return _actionDescriptor; }
set
{
if (value == null)
{
throw Error.PropertyNull();
}
_actionDescriptor = value;
}
}
/// <summary>
/// Gets the properties associated with this instance.
/// </summary>
public ConcurrentDictionary<object, object> Properties
{
get { return _properties; }
}
public virtual object DefaultValue
{
get { return null; }
}
public abstract string ParameterName { get; }
public abstract Type ParameterType { get; }
public virtual string Prefix
{
get
{
ParameterBindingAttribute attribute = ParameterBinderAttribute;
ModelBinderAttribute modelAttribute = attribute as ModelBinderAttribute;
return modelAttribute != null
? modelAttribute.Name
: null;
}
}
/// <summary>
/// Gets a value indicating whether the parameter is optional.
/// </summary>
/// <value>
/// <c>true</c> if the parameter is optional; otherwise, <c>false</c>.
/// </value>
public virtual bool IsOptional
{
get { return false; }
}
/// <summary>
/// Return a <see cref="ParameterBindingAttribute"/> if present on this parameter's signature or declared type.
/// Returns null if no attribute is specified.
/// </summary>
public virtual ParameterBindingAttribute ParameterBinderAttribute
{
get
{
if (_parameterBindingAttribute == null)
{
if (!_searchedModelBinderAttribute)
{
_searchedModelBinderAttribute = true;
_parameterBindingAttribute = FindParameterBindingAttribute();
}
}
return _parameterBindingAttribute;
}
set { _parameterBindingAttribute = value; }
}
public virtual Collection<T> GetCustomAttributes<T>() where T : class
{
return new Collection<T>();
}
private ParameterBindingAttribute FindParameterBindingAttribute()
{
// Can be on parameter itself or on the parameter's type. Nearest wins.
return ChooseAttribute(GetCustomAttributes<ParameterBindingAttribute>())
?? ChooseAttribute(ParameterType.GetCustomAttributes<ParameterBindingAttribute>(false));
}
private static ParameterBindingAttribute ChooseAttribute(IList<ParameterBindingAttribute> list)
{
if (list.Count == 0)
{
return null;
}
if (list.Count > 1)
{
// Multiple attributes specified at the same level
return new AmbiguousParameterBindingAttribute();
}
return list[0];
}
// Helper class to return an error binding if an parameter has an invalid attribute combination.
private sealed class AmbiguousParameterBindingAttribute : ParameterBindingAttribute
{
public override HttpParameterBinding GetBinding(HttpParameterDescriptor parameter)
{
string message = Error.Format(SRResources.ParameterBindingConflictingAttributes, parameter.ParameterName);
return parameter.BindAsError(message);
}
}
}
}