嗯,我需要为许多属性重复相同的代码。我已经看到了使用Action
代表的例子,但它们在这里不太适合。
我想要这样的东西:(见下面的解释)
Dictionary<Property, object> PropertyCorrectValues;
public bool CheckValue(Property P) { return P.Value == PropertyCorrectValues[P]; }
public void DoCorrection(Property P) { P.Value = PropertyCorrectValues[P]; }
.
我想有一个包含许多属性和它们各自的"正确"值的字典。(我知道它没有很好地宣布,但这就是我的想法)。属性不一定在我的类中,它们中的一些在不同程序集的对象中。
A方法bool CheckValue(Property)
。此方法必须具有access the actual value
和compare to the correct value
的性质。
和void DoCorrection(Property)
方法。这一个sets the property value
到正确的值
记住我有很多这样的属性,我不想为每个属性手工调用方法。我宁愿在foreach
语句中遍历字典。
所以,主要问题在标题中。
我试过
by ref
,但是属性不接受我有义务使用
reflection
吗??或者有其他选择(如果我需要,反射答案也将被接受)。无论如何,我可以在c#中使用
pointers
制作字典吗?还是用changes the value of variable's target
代替changing the target to another value
?
谢谢你的帮助
您可以使用反射来做到这一点。使用typeof(Foo).GetProperties()
获取感兴趣对象的属性列表。你的PropertyCorrectValues
属性的类型可以是IDictionary<PropertyInfo, object>
。然后在PropertyInfo
上使用GetValue
和SetValue
方法执行所需的操作:
public bool CheckProperty(object myObjectToBeChecked, PropertyInfo p)
{
return p.GetValue(myObjectToBeChecked, null).Equals(PropertyCorrectValues[p]);
}
public void DoCorrection(object myObjectToBeCorrected, PropertyInfo p)
{
p.SetValue(myObjectToBeCorrected, PropertyCorrectValues[p]);
}
除了Ben的代码,我还想贡献以下代码片段:
Dictionary<string,object> PropertyCorrectValues = new Dictionary<string,object>();
PropertyCorrectValues["UserName"] = "Pete"; // propertyName
PropertyCorrectValues["SomeClass.AccountData"] = "XYZ"; // className.propertyName
public void CheckAndCorrectProperties(object obj) {
if (obj == null) { return; }
// find all properties for given object that need to be checked
var checkableProps = from props
in obj.GetType().GetProperties()
from corr in PropertyCorrectValues
where (corr.Key.Contains(".") == false && props.Name == corr.Key) // propertyName
|| (corr.Key.Contains(".") == true && corr.Key.StartsWith(props.DeclaringType.Name + ".") && corr.Key.EndsWith("." + props.Name)) // className.propertyName
select new { Property = props, Key = corr.Key };
foreach (var pInfo in checkableProps) {
object propValue = pInfo.Property.GetValue(obj, null);
object expectedValue = PropertyCorrectValues[pInfo.Key];
// checking for equal value
if (((propValue == null) && (expectedValue != null)) || (propValue.Equals(expectedValue) == false)) {
// setting value
pInfo.Property.SetValue(obj, expectedValue, null);
}
}
}
当使用这个"自动"值校正时,你也可以考虑:
- 你不能仅仅通过知道属性名而独立于声明类来创建
PropertyInfo
对象;这就是为什么我选择string
作为键。 - 当在不同的类中使用相同的属性名时,您可能需要更改执行实际赋值的代码,因为正确值和属性类型之间的类型可能不同。
- 在不同的类中使用相同的属性名将总是执行相同的检查(见上文),因此您可能需要属性名的语法来将其限制为特定的类(简单的点符号,不适用于名称空间或内部类,但可能会扩展到这样做)
- 如果需要,你可以用单独的方法调用替换"check"one_answers"assign"部分,但它可能在代码块内完成,如我的示例代码中所述。