Может ли атрибут ссылаться на вложенный ресурс? - PullRequest
5 голосов
/ 01 декабря 2010

Я работаю над приложением, которое генерирует древовидную структуру узлов. Существует много типов узлов, каждый со своим поведением и свойствами. Я хочу приписать каждому типу узла свойства, включая отображаемое имя, описание и значок 16x16.

Вот код для созданного мной пользовательского атрибута:

public class NodeTypeInfoAttribute : Attribute
{
    public NodeTypeInfoAttribute(string displayName, string description, System.Drawing.Image icon)
        : this(displayName, description)
    {
        this.Icon = icon;
    }

    public NodeTypeInfoAttribute(string displayName, string description, string iconPath):this(displayName,description)
    {

        String absPath;
        if (System.IO.Path.IsPathRooted(iconPath))
        {
            absPath = iconPath;
        }
        else
        {
            string folder = System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location);
            absPath = System.IO.Path.Combine(folder, iconPath);
        }

        try
        {
            System.Drawing.Image i = System.Drawing.Image.FromFile(absPath);
        }
        catch (System.IO.FileNotFoundException)
        {
            Icon = null;
        }
    }

    public NodeTypeInfoAttribute(string displayName, string description)
    {
        this.DisplayName = displayName;
        this.Description = description;
    }

    public string DisplayName
    {
        get;
        private set;
    }


    public string Description
    {
        get;
        private set;
    }

    public System.Drawing.Image Icon
    {
        get;
        set;
    }

}

Обратите внимание, что у меня есть конструктор, который указывает значок как путь к файлу, и конструктор, который указывает значок как System.Drawing.Image.

Так что, в конечном итоге, я бы хотел использовать этот атрибут с таким встроенным ресурсом изображения.

[NodeTypeInfo("My Node","Sample Description",Properties.Resources.CustomIcon)]
public class CustomNode:Node
{
...

Однако этот код возвращает ошибку

An attribute argument must be a constant expression, typeof expression or 
array creation` expression of an attribute parameter type

Есть ли другой способ связать тип (не экземпляр) класса с изображением значка?

1 Ответ

3 голосов
/ 01 декабря 2010

Аргументы для конструктора атрибута хранятся в метаданных сборки. Это накладывает жесткие ограничения на то, какие типы аргументов вы можете использовать. Все, что требует кода, определенно не поддерживается. Вот что здесь не получается, для доступа к Properties.Resources требуется вызов метода получения свойства.

Здесь нет отличной альтернативы, если вы хотите обратиться к ресурсу. Имя ресурса, строка, это все, что я могу придумать. Получите объект ресурса в конструкторе атрибута с помощью Properties.Resources.ResourceManager.GetObject ()

...