2

C# で 2 つの複雑なオブジェクトを比較し、2 つの違いを含む Dictionary を作成しようとしています。

私がそのようなクラスを持っている場合:

public class Product
{
    public int Id {get; set;}
    public bool IsWhatever {get; set;}
    public string Something {get; set;}
    public int SomeOtherId {get; set;}
}

したがって、1つのインスタンス:

var p = new Product
                    {
                        Id = 1,
                        IsWhatever = false,
                        Something = "Pony",
                        SomeOtherId = 5
                    };

そして別:

var newP = new Product
    {
        Id = 1,
        IsWhatever = true
    };

これらの違いを得るために、私はこれを含むことをしています:

var oldProps = p.GetType().GetProperties();
var newProps = newP.GetType().GetProperties();

// snip 
foreach(var newInfo in newProps)
{
    var oldVal = oldInfo.GetValue(oldVersion, null);
    var newVal = newInfo.GetValue(newVersion,null);
}

// snip - some ifs & thens & other stuff

興味深いのはこの行です

var newVal = newInfo.GetValue(newVersion,null);

上記のオブジェクトの例を使用すると、この行はSomeOtherId(bools & DateTimes & whathaveyou についても同じ話) のデフォルト値 0 を提供します。

私が探しているのはnewProps、オブジェクトで明示的に指定されたプロパティのみを含める方法です。したがって、上記の例ではIdIsWhatever. 私はBindingFlags無駄に遊んだ。

これは可能ですか?それを行うためのよりクリーンな/より良い方法、または問題を解決するためのツールはありますか?

ありがとう。

4

3 に答える 3

2

プロパティが明示的に設定されているかどうかを示すフラグはありません。あなたができることは、プロパティをnull許容型として宣言し、値をnullと比較することです。

于 2013-03-14T14:59:39.840 に答える
1

私があなたを正しく理解していれば、これはマイクロソフトが xsd ユーティリティで生成された xml ラッピング クラスで行ったXIsSpecifiedことであり、各プロパティに対して 、またはそのようなものがありましXた。

したがって、これはあなたができることです-代わりにpublic int ID{get;set;}、プライベートメンバー_id、またはそれを呼び出すために選択したもの、およびのセッターが呼び出されるIDSpecifiedたびにtrueに設定されるブールプロパティを追加しますId

于 2013-03-14T15:00:20.973 に答える
0

リフレクションを使用せずに(または、少なくともこの方法で使用しないで)問題を修正することになりました。

多かれ少なかれ、次のようになります。

public class Comparable
{
    private IDictionary<string, object> _cache;

    public Comparable()
    {
        _cache = new Dictionary<string, object>();
    }

    public IDictionary<string, object> Cache { get { return _cache; } }

    protected void Add(string name, object val)
    {
        _cache.Add(name, val);
    }
}

そして、製品の実装は次のようになります。

public class Product : Comparable
{
    private int _id;
    private bool _isWhatever;
    private string _something;
    private int _someOtherId;

    public int Id {get { return _id; } set{ _id = value; Add("Id", value); } }
    public bool IsWhatever { get { return _isWhatever; } set{ _isWhatever = value; Add("IsWhatever ", value); } }
    public string Something {get { return _something; } set{ _something = value; Add("Something ", value); } }
    public int SomeOtherId {get { return _someOtherId; } set{ _someOtherId = value; Add("SomeOtherId", value); } }
}

そして、比較は非常に簡単です

var dic = new Dictionary<string, object>();

foreach(var obj in version1.Cache)
{
    foreach(var newObj in version2.Cache)
    {
        //snip -- do stuff to check equality
        dic.Add(....);
    }
}

モデルを大幅に汚さず、うまく機能します。

于 2013-03-14T20:31:35.040 に答える