2016-11-30 188 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