成员明智比较 - 嵌套对象的泛型反射

时间:2013-05-16 21:13:10

标签: c# .net generics reflection

我正在尝试编写一个泛型方法来对用户定义的对象进行成员比较,这些对象可能(几乎总是)具有多个嵌套级别。我正在寻找here的例子,只有一点点扭曲;如果属性不能与相等运算符(pTypes数组中的那些)进行比较,那么我想在当前属性中传递递归调用。我的代码将无法编译,我在递归调用中尝试了各种语法,我只是想知道什么是正确的语法?或者你可以这样做吗?

这是我现在的方法;

    public static string[] MemberWiseCompare<T>(T act, T exp) where T : ICommonObject
    {
        List<string> errors = new List<string>();

        if (act != null && exp != null)
        {
            Type[] pTypes = { typeof(int), typeof(bool), typeof(string), typeof(float), typeof(double), typeof(DateTime) };
            Type type = typeof(T);
            foreach (PropertyInfo pi in type.GetProperties(System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance))
            {
                if (pTypes.Contains(pi.PropertyType))
                {
                    if (type.GetProperty(pi.Name).GetValue(act, null) != type.GetProperty(pi.Name).GetValue(exp, null))
                    {
                        errors.Add(pi.Name);
                    }
                }
                else
                {
                    string[] innerErrors = MemberWiseCompare<pi.PropertyType>(pi.GetValue(act, null), pi.GetValue(exp, null));
                }
            }
        }
        return null;
    }

当然还有我尚未实现的方法的其他部分(聚合函数底部的错误并返回除null之外的其他内容)但是暂时我只关心获取递归MemberWiseCompare工作。从那里我可以弄清楚剩下的。我认为我在理解编译器从我为泛型指定的类型(即pi.PropertyType)中取出的内容时遇到了一些问题。我认为这样可行,因为它提供了我们将在通用调用中使用的类型。我也期待一些问题,它可以装箱我的值,以便GetValue返回object而不是更具体的类型。

编辑:编译错误是旧的“最佳重载方法有一些无效的args”

2 个答案:

答案 0 :(得分:1)

它不会编译,因为通用参数值必须在编译时可用。在对MemberWiseCompare的内部调用中,您试图向其传递仅在运行时可用的值。

有趣的是,你并不需要它是通用的 - 你使用反射来探索类型,你不需要参数编译时的实际类型。只需给出act和exp iCommonObject类型,编译将通过

答案 1 :(得分:0)

这应该有效:

string [] innerErrors = MemberWiseCompare(pi.GetValue(act,null),pi.GetValue(exp,null));