C# – Attributkonstruktorparameter ist kein gültiger Attributparametertyp

C# – Attributkonstruktorparameter ist kein gültiger Attributparametertyp

Problem

Ich habe eine benutzerdefinierte Attributklasse erstellt und versuche, einen Wert zu übergeben. Es sieht so aus:

public enum ComputerStatus
{
	[BgColor(Color.Yellow)]
	Unregistered,
	
	[BgColor(Color.LightGreen)]
	Registered,
	
	[BgColor(Color.Red)]
	PingFailed,
	
	[BgColor(Color.Red)]
	PortNotFound,
	
	[BgColor(Color.LightGreen)]
	FoundAndRegistered
}
Code language: C# (cs)

Ich erhalte die folgende Fehlermeldung:

Ich habe auch diese Fehlermeldung erhalten, die dieselbe Ursache hat:

Lösung

Sie müssen einen Wert angeben, der während der Kompilierzeit als konstant betrachtet wird.

Hier sind Beispiele dafür, welche Typen Sie übergeben können:

public enum CustomAttributeParameterTester
{
	[CustomAttributeValidParameters(typeof(ITestInterface))]
	Interface,

	[CustomAttributeValidParameters(typeof(Test))]
	Class,

	[CustomAttributeValidParameters(1)]
	IntegerLiteral,

	[CustomAttributeValidParameters(CustomAttributeValidParameters.ONE)]
	IntegerConstant,

	[CustomAttributeValidParameters("test string")]
	StringLiteral,

	[CustomAttributeValidParameters(1, 2, 3)]
	ParamsArray,

	[CustomAttributeValidParameters(new[] { true, false })]
	Array,

	[CustomAttributeValidParameters(TestEnum.Deployed)]
	Enum
}
public class CustomAttributeValidParameters : Attribute
{
	public const int ONE = 1;
	public CustomAttributeValidParameters(Type interfaceType)
	{

	}
	public CustomAttributeValidParameters(int i)
	{

	}
	public CustomAttributeValidParameters(string s)
	{

	}
	public CustomAttributeValidParameters(params int[] args)
	{

	}
	public CustomAttributeValidParameters(bool[] arr)
	{

	}
	public CustomAttributeValidParameters(TestEnum testEnum)
	{

	}
}
public enum TestEnum
{
	Init,
	Tested,
	Deployed
}
public interface ITestInterface
{ }
public class Test : ITestInterface
{

}
Code language: C# (cs)

Wie ich es für meine spezielle Situation gelöst habe

In meinem Fall muss ich, anstatt System.Drawing.Color (eine Struktur) zu verwenden, System.Drawing.KnownColor, eine Aufzählung (daher eine Konstante zur Kompilierzeit), übergeben und diese dann Color zuordnen.

BgColorAttribute – mein benutzerdefiniertes Attribut

using System;
using System.Drawing;

namespace AttributeProblem
{
    public class BgColorAttribute : Attribute
    {
        public Color Color { get; }

        public BgColorAttribute(KnownColor c)
        {
            //Why use KnownColor? Because can't have Color, which is a struct, as the parameter to an attribute!
            Color = Color.FromKnownColor(c);

        }
    }
}
Code language: C# (cs)

ComputerStatus – wo ich das benutzerdefinierte Attribut verwende

using System.Drawing;

namespace AttributeProblem
{
    public enum ComputerStatus
    {
        [BgColor(KnownColor.Yellow)]
        Unregistered,
        
        [BgColor(KnownColor.LightGreen)]
        Registered,
        
        [BgColor(KnownColor.Red)]
        PingFailed,
        
        [BgColor(KnownColor.Red)]
        PortNotFound,
        
        [BgColor(KnownColor.LightGreen)]
        FoundAndRegistered
    }
}

Code language: C# (cs)