C# – Passing an array of objects to Attribute constructor

attributesccustom-attributes

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.

Here is the code:

[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.

Best Answer

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.