如何使用for循环为多个类属性赋值,如项目列表?

时间:2013-07-22 06:00:59

标签: c#

我希望同时设置属性列表,是否可能? 谢谢!

public class Helper
{
    public bool A { get; set; }
    public bool B { get; set; }
    public bool C { get; set; }

    public void SetToFalse(List<Property> ABC)
    {
        // try to set A, B, C to false in a for loop
        foreach (var item in ABC)
        {
            item = false;
        }
    }
}

为什么我要这样做:我希望有一个干净的方法来同时切换布尔属性,而我无法将属性分组到列表中,因为上下文是ViewModel,属性绑定到Xaml。

4 个答案:

答案 0 :(得分:1)

我会使用rambda列表。

public class Helper
    {
    public bool A { get; set; }
    public bool B { get; set; }
    public bool C { get; set; }

    public List<Action<bool>> Setters { get; set; }
    public Helper()
        {
        this.Setters = new List<Action<bool>>() 
            { b => this.A = b, b => this.B = b, b => this.C = b };
        }

    public void SetToFalse(IEnumerable<Action<bool>> setters)
        {
        // try to set A, B, C to false in a for loop
        foreach (var a in setters)
            {
            a(false);
            }
        }
    }
你喜欢这个吗?

答案 1 :(得分:0)

这个应该有效。

Helper helper = new Helper();
//This will get all Boolean properties of your class
var properties = helper.GetType().GetProperties().Where(e=>e.PropertyType==typeof(Boolean));
//Completing all Boolean properties with "false"
foreach (var propertyInfo in properties)
{
    propertyInfo.SetValue(helper,false);
}

注意 - 在运行时使用反射是一个不好的举动(性能会下降)

答案 2 :(得分:0)

如果你需要支持那么多布尔标志,我会把它改成一个字典并做这样的事情:

class Class1
{
    private Dictionary<String, Boolean> boolenVars = new Dictionary<String, Boolean>();

    public Boolean getFlag(String key)
    {
        if (this.boolenVars.ContainsKey(key))
            return this.boolenVars[key];
        else
            return false;
    }

    public void setFlag(String key, Boolean value)
    {
        if (this.boolenVars.ContainsKey(key))
            this.boolenVars[key] = value;
        else
            this.boolenVars.Add(key, value);
    }

    public void clearFlags()
    {
        this.boolenVars.Clear();
    }
}

您可以为此目的创建一个枚举,而不是使用基于字符串的键,以确保在使用标志时没有拼写错误。

即使您决定添加7526个新的布尔标志,此解决方案也不需要进一步更改代码。

此解决方案还提供 - 如果使用公共getter或方法公开字典 - 所有“set”布尔标志的列表。

答案 3 :(得分:-1)

您可以使用对象初始值设定项来执行此操作。 VS将为您提供属性的智能感知。

http://msdn.microsoft.com/en-us/library/vstudio/bb384062.aspx

示例:

class Helper
{
    public bool A { get;set;}
    public bool B { get;set;}
}

Helper myclass = new Helper { A = false, B = false };

这不是使用for循环,但在我看来它更清晰。