2011-05-12 13 views
9

Nesneler özellikleri dizinleyici stiline erişmeme izin verecek herhangi bir araç, kitaplık var mı?C# Nesne özelliklerine erişme dizinleyici stili

public class User 
{ 
    public string Name {get;set;} 
} 

User user = new User(); 
user.Name = "John"; 

string name = user["Name"]; 

Belki de dinamik anahtar kelime burada bana yardımcı olabilir?

+1

. Neden bunu yapmak istesin ki? –

+0

Bazı raporlama işlerini yapmak için genel bir yol oluşturmaya çalışıyorum. – user256034

cevap

3

Dizin oluşturucular hakkında this göz atın. Sözlük, özellikleri kullanmak yerine tüm değerleri ve anahtarları saklar. Bu şekilde, performansı kaybetmeden çalışma koşullarında yeni özellikler ekleyebilirsiniz

public class User 
{ 
    Dictionary<string, string> Values = new Dictionary<string, string>(); 
    public string this[string key] 
     { 
      get 
      { 
       return Values[key]; 
      } 
      set 
      { 
       Values[key] = value; 
      } 
     } 
} 
+0

Birçok nesne var, bu yüzden her nesne için bunu uygulamak bir seçenek değildir. – user256034

+0

@ user256034 Bunu yalnızca bir kez yapın ve değerleri, değerler yerine sözlükte saklayın. –

0

Yansıma ve dizin oluşturucu ile kendiniz oluşturabilirsiniz.

Fakat böyle bir çözüm için neye ihtiyacınız var? Sen kadar bunu yapamaz bunun için bir dizin kullanmak istiyorsanız

PropertyInfo info = user.GetType().GetProperty("Name"); 
    string name = (string)info.GetValue(user, null); 

Ve bu

public object this[string key] 
    { 
     get 
     { 
      PropertyInfo info = this.GetType().GetProperty(key); 
      if(info == null) 
       return null 
      return info.GetValue(this, null); 
     } 
     set 
     { 
      PropertyInfo info = this.GetType().GetProperty(key); 
      if(info != null) 
       info.SetValue(this,value,null); 
     } 
    } 
10

sınıf bir Indexer uygular.

+1

Bu benim performansımı incitmez mi? – user256034

+1

@ user256034 Çok fazla olurdu. Fakat çalışma zamanında bir özellik bulmak çok yavaştır. Bunu hızlı yapmanın tek yolu, uygulamamla birlikte –

+0

Bir dinamik kullanmak kadar değil. Dinamikler, gerektiğinde çalışma zamanında derlenir. –

1

gibi bir şey deneyebilirsiniz adıyla özellik değerini almak için yansıma kullanabilirsiniz

2

DynamicObject'i devraldırabilir ve bu şekilde yapabilirsiniz.

http://msdn.microsoft.com/en-us/library/system.dynamic.dynamicobject.trygetindex.aspx

yalnızca 'nesne' dönen (ve döküm zorunda) veya sınıftaki tek dize türleri olan ya sınırlayan başkaları tarafından burada bahsedilen basit dizin yöntemi kullanarak.

Düzenleme: Başka yerlerde de belirtildiği gibi, dinamik olsa bile, TryGetIndex işlevindeki değeri almak için yansıma veya bir tür arama kullanmanız gerekir.

+0

bir örnek gösterebilir misiniz? – user256034

+0

@ user256034 Yukarıdaki bağlantıda iyi bir örnek var. –

1

az önce benzer bir şey yapmak için yansıma kullanabileceği bir dize değerine dayalı bir özelliğe erişmek istiyorsanız: ilgi Out

string name = typeof(User).GetProperty("Name").GetValue(user,null).ToString(); 
İlgili konular