3

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.

2 Answers 2

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.

Sign up to request clarification or add additional context in comments.

9 Comments

Thanks for the explaining. Do you know why it is limited? What is wrong passing array of objects?
@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.
@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.
@Dilshod, here is some more reading by Eric Lippert.
Yes, it looks like there is no more options. Thanks for the help!
|
1

I think the error quoted comes when you try to apply 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.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.