1

2 つの類似したオブジェクト (C#) 間のバインドが必要です。

public class TypeA
{
     public int I;
     public string S;
}

public class TypeB
{
     public IntField I;
     public StringField S;
}

TypeA のフィールドが変更されたら、TypeB の一致するフィールドを更新する必要があります。

IntField は int 型の Value フィールドを持つオブジェクトであるため、TypeB の更新は次のように記述できます。

bInstance.I.Value = aInstance.I;

私が正しく理解していれば、TypeB を TypeA にバインドするために INotifyPropertyChanged を使用すると、ボイラープレートが発生します。

aInstance.PropertyChanged += (sender, args) =>
{
    if (args.PropertyName == "I")
        this.I.Value = sender.I;
    if (args.PropertyName == "S")
        this.S.Value = sender.S;
};

また:

  • 私は両方のタイプのコードにアクセスできますが、TypeB は変更したくありません。
  • TypeA や TypeB などの型のペアが 15 まであります。ボイラープレートは避けたいと思います。
  • パフォーマンスは非常に重要であるため、リフレクションは推奨されるオプションではありません。
  • おそらく静的反射はオプションですか?聞いたことはありますが、次の点についてはわかりません。
    • ボイラープレートなしで使用する方法。
    • その性能。
    • 同じタイプのペアの異なるインスタンスに使用します (つまり、a1Instance->b1Instance、a2Intance->b2Instance など)。

編集:

IntField はクラスです。これは、システムに存在する別のタイプのデータ バインディングに使用されます (複雑で、システム全体がこれに依存しています)。一般的なバインド可能なフィールドを表すクラスから継承します。ここにその一部があります:

public class IntField : GeneralField
{
    private int _value;
    public int Value
    {
        get { return _value; }
        set
        {
            IsDirty = true;
            _value = value;
        }
    }

    // ... a couple of abstract method implementations go here (setting _value, and getting value in a non-type specific way)
}
4

1 に答える 1