使用一种方法设置多个属性

时间:2012-09-16 19:59:37

标签: c#

所以我有一个带有三个属性的c#类。

public class ClassA
{
    public bool IsBool1;
    public bool IsBool2;
    public bool IsBool3;
}

我有一个方法可以执行以下操作。

public void MethodA()
{
    ClassA c = GetCurrentClassA();
    c.IsBool1 = !c.IsBool1;
    ClassADataAccess.Update(c);
    this.BindClassADetails(c);
}

现在为了避免为其他两个属性编写MethodA,有没有办法编写一个可以处理所有三个属性的方法?

可能是这样的东西?

public void UpdateAndBind(bool value)
{
    ClassA c = GetCurrentClassA();

    ///what to do here to set the property?

    ClassADataAccess.Update(c);
    this.BindClassADetails();
}

3 个答案:

答案 0 :(得分:1)

回应你的评论:

  

这可能完全正常,我只是想知道是否有方法告诉方法传入的对象中的哪个属性设置。 - Chris Whisenhunt

有一种方法可以使用反射:

    // using a generic method, you can specify the name of the property you want to set, 
    // the instance you want it set on, and the value to set it to...
    private T SetProperty<T>(T instance, string propertyName, object value)
    {
        Type t = typeof(T);
        PropertyInfo prop = t.GetProperty(propertyName);
        prop.SetValue(instance, value, null);
        return instance;
    }

现在......您可能想要使用try / catch,也可能在以各种方式使用它之前检查传入的内容以确保它不会爆炸...但通常,最简单的是,这是你会这样做的。 祝你好运!

答案 1 :(得分:0)

如何为GetCurrentClassA方法添加参数,以便指定所需的值?

public void MethodA()
{
    ClassA c = GetCurrentClassA(true, false, true);
    ClassADataAccess.Update(c);
    this.BindClassADetails(c);
}

答案 2 :(得分:0)

可以使用Func委托作为输入参数来完成。

首先,您需要使用属性,而不是字段:

public class ClassA
{
    public bool IsBool1 { get; set; }
    public bool IsBool2 { get; set; }
    public bool IsBool3 { get; set; }
}

然后,您需要两个Func委托作为输入参数:

public ClassB
{
     public void UpdateAndBind(Func<ClassA, bool> getProp, Func<ClassA, bool, ClassA> setProp)
    {
        ClassA c = GetCurrentClassA();

        // What to do here to set the property?
        setProp(c, getProp(c));

        ClassADataAccess.Update(c);
        this.BindClassADetails(c);
    }
    ...
}

最后,用法如下:

static void Main(string[] args)
{
    ClassB classB = new ClassB();
    classB.UpdateAndBind(classA => classA.IsBool1, (classA, value) => { classA.IsBool1 = !value; return classA; });
    classB.UpdateAndBind(classA => classA.IsBool2, (classA, value) => { classA.IsBool2 = !value; return classA; });
    classB.UpdateAndBind(classA => classA.IsBool3, (classA, value) => { classA.IsBool3 = !value; return classA; });
}