Pasar una matriz de objetos al constructor de atributos

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.

preguntado el 09 de septiembre de 13 a las 21:09

2 Respuestas

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

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

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 or haz tu propia pregunta.