Pasar una matriz de objetos al constructor de atributos
Frecuentes
Visto 5,590 veces
2
I have custom attribute that takes array of objects. I am trying to pass an array of objects to it, but receive compiler error:
An attribute argument must be a constant expression, typeof expression or array creation expression of an attribute parameter type.
Aquí está el código:
[AttributeUsage(AttributeTargets.Class)]
public class MyAttribute : Attribute
{
public MyAttribute(Person[] people)
{
People = people;
}
public Person[] People{get; private set;}
}
public class Person
{
public string Name{get;set;}
public string LastName{get;set;}
}
I saw some articles online, but haven't seen any closer to mine. Am I doing something wrong or it is bug? If it is not bug can someone explain why I can't pass array of Person
? I tried array of string and it works fine.
2 Respuestas
5
It's because an array of string
is a compile-time constant whereas an array of Person
is not. This isn't a bug, it's a limitation. The best way around it, that I've found, is by using reflection to set the attributes properties on creation of the object - but it's not pretty.
Respondido el 09 de Septiembre de 13 a las 21:09
1
I think the error quoted comes when you try to aplicar your attribute to some code element. As in:
[My(new[] { new Person(), })]
You cannot use an array like that. While the expression in ()
is an array creation expression, it is not an array creation expression of an attribute parameter type since, by definition, the class Person
is not an attribute parameter type.
Respondido el 09 de Septiembre de 13 a las 21:09
No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas c# attributes custom-attributes or haz tu propia pregunta.
Thanks for the explaining. Do you know why it is limited? What is wrong passing array of objects? - Dilshod
@Dilshod, attributes are applied to the
Type
, not the object. This means that there's no real way for the CLR to apply them to individual objects. - mike perrenoud@Dilshod, in your case the best approach would be to pass an array of strings to the attribute and then load those
Person
objects at run-time. - mike perrenoud@Dilshod, here is some more reading by Eric Lippert. - mike perrenoud
Yes, it looks like there is no more options. Thanks for the help! - Dilshod