我正在尝试编写一个泛型方法来对用户定义的对象进行成员比较,这些对象可能(几乎总是)具有多个嵌套级别。我正在寻找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”
答案 0 :(得分:1)
它不会编译,因为通用参数值必须在编译时可用。在对MemberWiseCompare的内部调用中,您试图向其传递仅在运行时可用的值。
有趣的是,你并不需要它是通用的 - 你使用反射来探索类型,你不需要参数编译时的实际类型。只需给出act和exp iCommonObject类型,编译将通过
答案 1 :(得分:0)
这应该有效:
string [] innerErrors = MemberWiseCompare(pi.GetValue(act,null),pi.GetValue(exp,null));