2016-11-30 195 views
0

這裏有一些問題:獲得價值

1)首先,我在Class1的

class Class1 
{ 
    IEnumerable itemSource; 

    public IEnumerable ItemSource 
    { 
     set { itemSource = value; } 
     get { return itemSource; } 
    } 
} 

2)一個名爲類已經一個屬性TempClass

public class TempClass 
{ 
    int a; 
    public int A 
    { 
     set { a = value; } 
     get { return a; } 
    } 

    public TempClass() { } 
    public TempClass(int t) { A = t; } 
} 

3 )在static void Main(string[] args),我試過這個:

ObservableCollection<TempClass> test = new ObservableCollection<TempClass> 
{ 
    new TempClass(1), 
    new TempClass(2), 
    new TempClass(3) 
} 

Class1 class1 = new Class1(); 
class1.ItemSource = test; 

foreach (var item in class1.ItemSource) 
{ 
    Console.WriteLine(item); 
} 

4)然後,控制檯顯示此:

testSolution.TempClass 
testSolution.TempClass 
testSolution.TempClass 

其中testSolution是我的解決方案的名稱,所以是命名空間的名稱。

我想要得到的值:1,2,3

在這裏,我想提出的是,顯示任何類類型的任何集合或列表的值的屬性和方法。

在這種情況下,的ItemSource屬性和方法有:

foreach (var item in class1.ItemSource) 
{ 
    Console.WriteLine(item); 
} 

怎麼辦呢?

+0

的IEnumerable''是什麼的IEnumerable的class1的類型?我可以假設類型'TempClass'?或簡單地'IEnumerable 其中T:Class'? – Jaya

+0

不..我必須做一個前提的方法,我不知道類型,在這種情況下TempClass。因此,首先我必須找到 – wallah

+0

類型的屬性。您必須使用反射,但是知道正在處理的集合類型會很好嗎? – Jaya

回答

2

這可能需要修改,我只是擺出瞭如何使用反射時的類型和性質不明的想法。我沒有測試此代碼,可以隨意修改

foreach(var objUnknown in ItemSource) { 
    foreach(var prop in objUnknown.GetType().GetProperties()) { 
     Console.WriteLine("{0}={1}", prop.Name, prop.GetValue(objUnknown, null)); 
    } 
} 
+1

哇...它的作品!非常感謝 – wallah

1

試試這個:

foreach (var item in class1.ItemSource) 
{ 
    Console.WriteLine(((TempClass)item).A); 
} 

第二個選擇是,重寫爲對方的回答表明,更改類定義是這樣的:

public class TempClass 
{ 
    int a; 
    public int A 
    { 
     set { a = value; } 
     get { return a; } 
    } 
    public TempClass() { } 
    public TempClass(int t) { A = t; } 
    public override string ToString() 
    { 
     return A.ToString(); 
    } 
} 

和打印這樣的值:

foreach (var item in class1.ItemSource) 
{ 
    Console.WriteLine(item.ToString()); 
} 

注意:迭代時,無需瞭解類或屬性使用overrided每個類和打印回報,你想打印屏幕上的內容.ToString()方法,讓這裏有一個例子:

public class student 
{ 
    public int id { get; set; } 
    public String fName { get; set; } 
    public String lName { get; set; } 

    public override string ToString() 
    { 
     return String.Format("Student ID : {0} \n Full Name : {1} {2}", id, fName, lName); 
    } 
} 

在這裏,在這種情況下,item.ToString()將打印Student ID : 1 Full Name : suji vasuki

+0

關鍵是我不知道'A'。我不知道類型和屬性 – wallah

+0

它是非常有幫助的!非常感謝 !! :) – wallah

1

您需要這TempClass

 public override string ToString() 
     { 
      return A.ToString(); 
     } 

對於一個通用的解決方案,就需要約束:

public class Class1<T> where T : Temp 
    { 
     public IEnumerable<T> ItemSource 
     { 
      get; 
      set; 
     } 

     public void WriteLine() 
     { 
      foreach (var item in ItemSource) 
      { 
       Console.WriteLine(item.A); 
      } 
     } 
    } 

    public abstract class Temp 
    { 
     public abstract int A { get; set; } 
    } 

    public class TempClass : Temp 
    { 
     public override int A 
     { 
      get; 
      set; 
     } 

     public TempClass(int t) { A = t; } 
    } 

寫入屬性答:

 ObservableCollection<TempClass> test = new ObservableCollection<TempClass> 
     { 
      new TempClass(1), 
      new TempClass(2), 
      new TempClass(3) 
     }; 

     Class1<TempClass> class1 = new Class1<TempClass>(); 
     class1.ItemSource = test; 
     class1.WriteLine(); 
+0

重點是我不知道'A'。我不知道類型和屬性 – wallah

+0

éc,你的意思是你甚至不知道'TempClass'? –

+0

是的,我應該做一個事實,我不知道收集或列表的類型 – wallah