将属性作为参数传递给get和Set



嗯,我需要为许多属性重复相同的代码。我已经看到了使用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 valuecompare 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上使用GetValueSetValue方法执行所需的操作:

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"部分,但它可能在代码块内完成,如我的示例代码中所述。

相关内容

  • 没有找到相关文章

最新更新