2

次のクラスがあります。

public class Person
{
    public String FirstName { set; get; }
    public String LastName { set; get; }
    public Role Role { set; get; }
}

public class Role
{
    public String Description { set; get; }
    public Double Salary { set; get; }
    public Boolean HasBonus { set; get; }
}

以下の例のように、Person1 と Person2 の間のプロパティ値の差異を自動的に抽出できるようにしたいと考えています。

public static List<String> DiffObjectsProperties(T a, T b)
{
    List<String> differences = new List<String>();
    foreach (var p in a.GetType().GetProperties())
    {
        var v1 = p.GetValue(a, null);
        var v2 = b.GetType().GetProperty(p.Name).GetValue(b, null);

        /* What happens if property type is a class e.g. Role???
         * How do we extract property values of Role?
         * Need to come up a better way than using .Namespace != "System"
         */
        if (!v1.GetType()
            .Namespace
            .Equals("System", StringComparison.OrdinalIgnoreCase))
            continue;

        //add values to differences List
    }

    return differences;
}

Role in Person のプロパティ値を抽出するにはどうすればよいですか???

4

3 に答える 3

2
public static List<String> DiffObjectsProperties(object a, object b)
{
    Type type = a.GetType();
    List<String> differences = new List<String>();
    foreach (PropertyInfo p in type.GetProperties())
    {
        object aValue = p.GetValue(a, null);
        object bValue = p.GetValue(b, null);

        if (p.PropertyType.IsPrimitive || p.PropertyType == typeof(string))
        {
            if (!aValue.Equals(bValue))
                differences.Add(
                    String.Format("{0}:{1}!={2}",p.Name, aValue, bValue)
                );
        }
        else
            differences.AddRange(DiffObjectsProperties(aValue, bValue));
    }

    return differences;
}
于 2009-01-08T03:55:22.023 に答える
1

プロパティが値の型ではない場合、それらに対して DiffObjectProperties を再帰的に呼び出して、結果を現在のリストに追加してみませんか? おそらく、それらを繰り返し処理し、プロパティの名前をドット表記で前に追加して、何が違うのかを確認する必要があります-または、リストが空でない場合、現在のプロパティが異なることを知るだけで十分かもしれません.

于 2009-01-08T03:40:20.040 に答える
0

次のことを確認する方法がわからないためです。

var v1 = p.GetValue(a, null);

String FirstName または Role Role です。v1 が FirstName やクラス Role などの文字列であるかどうかを確認する方法を見つけようとしています。したがって、オブジェクト プロパティ (Role) を DiffObjectsProperties に再帰的に渡して、そのプロパティ値を反復するタイミングがわかりません。

于 2009-01-08T03:45:09.970 に答える