从IEnumerable集合中获取价值

时间:2016-11-30 03:09:55

标签: c#

这里有一些问题:

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

怎么做?

3 个答案:

答案 0 :(得分:2)

这可能需要修改,我只是想知道如何在类型和属性未知时使用反射。 我没有测试此代码,因此可以随意修改

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

答案 1 :(得分:1)

试试这个:

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

第二个选项是,Overriding正如另一个答案所示,更改类定义如下:

class1.ItemSource

并打印出这样的值:

.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

在这种情况下,$.getJSON(requestURL, onSuccess);会打印$test1 = \DB::table('test1')->select('test1.first as example', 'test1.timestamp')->orderBy('timestamp', 'desc'); $test2 = \DB::table('test2')->select('test2.second as example2', 'test2.timestamp')->orderBy('timestamp', 'desc'); $test3 = \DB::table('test3')->select('test3.third as example3', 'test3.timestamp')->orderBy('timestamp', 'desc'); $testArray = $testArray->unionAll($test1)->unionAll($test2)->unionAll($test3); $arrays = $testArray->get()->toArray();

答案 2 :(得分: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; }
    }

写下属性A:

        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();