所以我有一个带有三个属性的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();
}
答案 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; });
}