好吧,我需要为许多属性重复相同的代码。
我见过代表Action
代表的例子,但是它们在这里并不适合。
我想要这样的事情:(见下面的解释)
Dictionary<Property, object> PropertyCorrectValues;
public bool CheckValue(Property P) { return P.Value == PropertyCorrectValues[P]; }
public void DoCorrection(Property P) { P.Value = PropertyCorrectValues[P]; }
我想要一个包含许多属性及其各自“正确”值的字典。 (我知道它没有很好地宣布,但这是个主意)。属性不是我班级内部必需的,其中一些属于不同组件的对象。
方法bool CheckValue(Property)
。此方法必须access the actual value
属性compare to the correct value
。
方法a 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
?
感谢您的帮助。
答案 0 :(得分:2)
您可以使用反射来完成此操作。使用typeof(Foo).GetProperties()
获取感兴趣对象的属性列表。您的PropertyCorrectValues
媒体资源可以包含IDictionary<PropertyInfo, object>
类型。然后使用GetValue
上的SetValue
和PropertyInfo
方法执行所需的操作:
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]);
}
答案 1 :(得分:0)
除了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
的原因。