2010-12-01 5 views
5

Düğümlerin ağaç yapısını oluşturan bir uygulama üzerinde çalışıyorum. Her biri belirli davranışları ve özellikleri olan birçok düğüm türü vardır. Her düğüm türünü, bir görüntü adı, açıklama ve 16x16 simgesi içeren özelliklerle ilişkilendirmek istiyorum.Bir özellik gömülü bir kaynağa başvuruda bulunabilir mi?

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

} 

Bir dosya yolu olarak Simge belirten bir yapıcı Not ve System.Drawing.Image olarak simge belirten bir yapıcısı:

İşte özel için kod oluşturduğum özellik bu.

Sonuç olarak, bu özniteliği, bunun gibi yerleşik bir görüntü kaynağıyla kullanmak istiyorum.

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

Ancak, bu kod ben bir simge resmi olan bir sınıfın bir türü (değil bir örneği) ilişkilendirebileceğiniz başka yolu var mı hata

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

döndürür?

cevap

3

Nitelik yapıcısı için argümanlar, derleme meta verilerinde saklanır. Bu, ne tür argüman türlerini kullanabileceğiniz konusunda ciddi kısıtlamalar getirir. Kod gerektiren herhangi bir şey kesinlikle desteklenmemektedir. Burada başarısız olan, Properties.Resources öğesine erişme, mülk sahibini çağırmayı gerektirir.

Burada bir kaynağa başvurmak istediğiniz sürece mükemmel bir alternatif yok. Kaynak adı, bir dize, aklıma gelen tek şey. Attribute constructor içinde resource nesnesini Properties.Resources.ResourceManager.GetObject()

ile edinin.