Это примерно , как передаются аргументы для создания экземпляра целевого типа IAuthorization
(в данном случае Claims2Filter
).
Если свойство Arguments
(которое является массивом) объекта) содержит несколько элементов, тогда каждый элемент считается отдельным аргументом для передачи отдельному параметру конструктора целевого IAuthorization
типа. Другими словами, требуется взаимно-однозначное сопоставление между количеством элементов в Argument
и числом параметра конструктора.
Таким образом, когда Arguments
содержит два объекта Claim, среда выполнения фактически ожидая, что Claims2Filter
будет иметь следующий конструктор -
public ClaimsFilter(Claim claim1, Claim claim2)
{
//
}
Чтобы использовать конструктор (типа IAuthorization
), который принимает один параметр, который является массивом объекта Claim, свойство Arguments
(типа TypeFilterAttribute
) должен содержать один элемент, который является массивом объекта Claim.
Итак, следующее изменение заставляет все работать как положено -
public class Claims2Attribute : TypeFilterAttribute
{
public Claims2Attribute(string claimType, params string[] claimValues) : base(typeof(Claims2Filter))
{
var claims = new Claim[claimValues.Length];
for (int i = 0; i < claimValues.Length; i++)
{
claims[i] = new Claim(claimType, claimValues[i]);
}
this.Arguments = new object[] { claims };
}
}
Я надеюсь, что объяснение достаточно ясно.