4

我想同时设置一个属性列表,可以吗?谢谢!

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

4 回答 4

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

你喜欢吗?

于 2013-07-22T06:10:44.037 回答
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);
}

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

于 2013-07-22T06:17:00.330 回答
0

如果您需要支持那么多布尔标志,我会将其更改为 Dictionary 并执行以下操作:

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 或方法公开字典 - 所有“设置”布尔标志的列表。

于 2013-07-22T08:33:10.973 回答
-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 循环,但在我看来它更干净。

于 2013-07-22T06:09:34.693 回答