2014-02-13 46 views
0

我將非常感謝任何幫助。我有一個字符串作爲輸入。我們稱之爲'table_name'。我想創建一個table_names的集合(其中table_name是被引用項目中的實際對象)。我做了以下內容:C#獲取Generic對象的成員

Object obj = Activator.CreateInstance("ClassLibrary", "ClassLibrary." + table_name); 
Type CollectionType = typeof(Collection<>).MakeGenericType(new[] { obj.GetType() }); 
ICollection c = (ICollection)Activator.CreateInstance(CollectionType); 

然後我打電話的方法(它位於不同的項目,並且返回一個對象的集合),填補了我的ICollection對象(在這種情況下,C):

object[] parameters = new object[] { x_coord, y_coord, buffer_dist}; 
c = (ICollection)sde_db.GetType().GetMethod("Method" + table_name).Invoke(sde_db, parameters); 

到目前爲止一切正常。我可以看到集合中元素的數量。但問題是,當我嘗試遍歷集合時,它不顯示其元素。我只能在運行時看到它們。有沒有辦法在編譯期間檢索集合的成員?我想要類似:

for(int i = 0; i < c.Count; i++){ 
    label.Text = c[i].Details; 
} 

謝謝!

+0

是否有某些原因導致您無法正常聲明集合?這看起來像是一個非常迂迴的做法。 – Magus

+0

編譯器不知道它們在編譯時鍵入的是什麼,運行時決定它。如果你在編譯時知道,你不需要做這些反射。 –

+0

您定位的是C#的哪個版本? C#4.0和5.0具有動態對象。 – diegog

回答

0

因爲我只需要關於ICollection中每個元素的詳細信息,所以我使用System.Xml.Serialization來獲取包含集合中特定元素信息的字符串。

for (int i = 0; i < c.Count; i++) 
     { 
      System.Xml.Serialization.XmlSerializer x = new System.Xml.Serialization.XmlSerializer(c[i].GetType()); 
      using (StringWriter writer = new StringWriter()) 
      { 
       x.Serialize(writer, c[i]); 
       String details = writer.ToString(); 
      } 
        //do here what ever you want 
     } 
0

是的,但你必須回答什麼成員在那裏以及你打算如何使用它們(最重要的是,當你編寫代碼時,編譯器知道你的意思,例如.Details)。例如。如果你的對象將始終貫徹一個接口...

public interface IHasDetails 
{ 
    string Details { get; } 
} 

然後你就可以把對象爲該類型:

label.Text = ((IHasDetails)c[i]).Details; 

如果你只是想動態地訪問它,使用dynamic

label.Text = ((dynamic)c[i]).Details; 
0

ICollection沒有定義索引存取器,所以你不能做c[i]

難道你不能用IList代替嗎?

0

爲了在編譯期間訪問成員,您需要使用具有可用成員的具體類型。鑑於您動態訪問涉及的類型,除非它們具有共同的,已知的基本類型或接口,否則這似乎不可行。如果沒有這些機制之一,你就會減少某種動態訪問。