2010-12-01 17 views
5

Estoy trabajando en una aplicación que genera una estructura en árbol de nodos. Hay muchos tipos de nodos, cada uno con comportamiento y propiedades específicos. Quiero atribuir cada tipo de nodo con propiedades que incluyen un nombre para mostrar, una descripción y un ícono de 16x16.¿Puede un atributo hacer referencia a un recurso embebido?

Aquí está el código para el atributo personalizado que he creado:

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; 
    } 

} 

Tenga en cuenta que tengo un constructor que especifica el icono como una ruta de archivo, y un constructor que especifica el icono como un System.Drawing.Image.

Así que, en última instancia, me gustaría poder utilizar este atributo con un recurso de imagen incrustado como este.

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

Sin embargo, este código devuelve el error

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

¿Hay alguna otra manera de que pueda asociar un tipo (no es un ejemplo) de una clase con una imagen de icono?

Respuesta

3

Los argumentos para un constructor de atributo se almacenan en los metadatos del conjunto. Eso impone severas restricciones sobre qué tipo de tipos de argumento puede usar. Cualquier cosa que requiera código definitivamente no es compatible. Que es lo que falla aquí, accediendo a Properties.Resources requiere llamar a un getter de propiedad.

No hay una gran alternativa aquí siempre que quiera referirse a un recurso. El nombre del recurso, una cadena, es todo lo que puedo pensar. Obtenga el objeto de recurso en el constructor de atributo con Properties.Resources.ResourceManager.GetObject()

Cuestiones relacionadas