2010-12-01 13 views
5

私は、ノードのツリー構造を生成するアプリケーションに取り組んでいます。ノードには多くのタイプがあり、それぞれに固有の動作とプロパティがあります。私は、表示名、説明、および16×16のアイコンを含むプロパティを持つ各ノードタイプを属性にしたいと考えています。属性は埋め込みリソースを参照できますか?

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 

返しますか?

答えて

3

属性コンストラクタの引数はアセンブリメタデータに格納されます。これは、使用できる引数の種類の種類に厳しい制限を課します。コードを必要とするものは、まったくサポートされていません。ここで失敗するのは、Properties.Resourcesにアクセスするには、プロパティゲッターを呼び出す必要があります。

ここでは、リソースを参照したい限り、素晴らしい代替方法はありません。リソース名、文字列は私が考えることができるすべてです。プロパティコンストラクタでリソースオブジェクトを取得するにはProperties.Resources.ResourceManager.GetObject()

関連する問題