使用foreach语句操纵类的成员

时间:2016-02-02 06:59:27

标签: c#

我的班级有一堆可以为空的双重属性。在运行时,其中一些值为0,我将在发送操作之前将它们设置为null。我知道我们可以使用foreach语句迭代已放置在类中的集合,所以我希望对此问题使用相同的技术。正如我在这种情况下所说,我不是在处理一个集合 实现IEnumerable是一种毫无意义的想法。 有什么方法可以在班级成员之间移动吗?

我试过这个

Class1 c=new Class1(){Age = 12,Family = "JR",Name = "MAX"};
foreach (string member in c)
{
    Console.WriteLine(member);
}
Console.ReadKey();

实施IEnumerable

public IEnumerator GetEnumerator()
{
    // ?!
}

3 个答案:

答案 0 :(得分:2)

您必须使用Reflection,请查看

How to get the list of properties of a class?

我添加了一个新的双?你班上的财产。

    class Class1
    {
        public int Age { get; set; }
        public string Family { get; set; }
        public string Name { get; set; }

        public double? d { get; set; }
    }

    [Test]
    public void MyTest()
    {
            Class1 c = new Class1() { Age = 12, Family = "JR", Name = "MAX" };
            foreach (var prop in c.GetType().GetProperties().Where(x => x.PropertyType == typeof(double?)))
            {
                Console.WriteLine("{0}={1}", prop.Name, prop.GetValue(c));
                prop.SetValue(c, (double?)null); // set null as you wanted
            }
    }

答案 1 :(得分:2)

您可以使用 Reflection Linq 来实现此目标

cheeseQuestion.text = "What kind of cheese do you like?"

测试

using System.Reflection;
...

private static void ApplyNullsForZeroes(Object value) {
  if (null == value)
    return; // Or throw exception 

  var props = value.GetType()
    .GetProperties(BindingFlags.Public | BindingFlags.Instance)
    .Where(p => p.CanRead && p.CanWrite)
    .Where(p => p.PropertyType == typeof(Nullable<Double>));

  foreach (var p in props)
    if (Object.Equals(p.GetValue(value), 0.0))
      p.SetValue(value, null);
}

答案 2 :(得分:0)

正如您所说,您拥有属性,那么为什么不将它们用作Property

get中使用条件。获取属性值时返回null

get
{
    return Age == 0 ? null : Age; //supposing "Age" is double in case to show an example
}