0

さて、多くのプロパティに対して同じコードを繰り返す必要があります。デリゲートを使用する例を見てきまし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か??? または、別のオプションがありますか(必要に応じて、反射回答も受け入れられます)。

  • pointersC#で辞書を作成できる方法はありますか? または、changes the value of variable's target代わりにchanging the target to another value?

助けてくれてありがとう。

4

2 に答える 2

2

これは、リフレクションを使用して行うことができます。を使用して、対象のオブジェクトのプロパティのリストを取得しますtypeof(Foo).GetProperties()。あなたのPropertyCorrectValuesプロパティは type を持つことができます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]); 
}
于 2013-05-08T22:08:45.497 に答える
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それが私がキーに選んだ理由です。
  • 異なるクラスで同じプロパティ名を使用する場合、正しい値とプロパティ タイプのタイプが異なる可能性があるため、実際の割り当てを行うコードを変更する必要がある場合があります。
  • 異なるクラスで同じプロパティ名を使用すると、常に同じチェックが実行されるため (上記のポイントを参照)、特定のクラスに制限するプロパティ名の構文が必要になる場合があります (単純なドット表記、名前空間または内部クラスでは機能しません)。 、しかしそうするために拡張されるかもしれません)
  • 必要に応じて、「チェック」部分と「割り当て」部分を別々のメソッド呼び出しに置き換えることができますが、コード例で述べたように、コード ブロック内で行うこともできます。
于 2013-05-08T23:02:04.420 に答える