作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有几个复杂的对象,我想比较它们的属性。下面的代码做得很好,直到你到达一个集合。我想用集合中的每个成员递归调用该函数。有人可以看一下并帮助我确定集合中对象的类型,以便我可以再次调用 HasPropertyChanged 吗?
这段伪代码表明了我的意图
if (p.GetType() == typeof(System.Collections.Generic.List<>))
{
foreach (var blah in //the list)
{
HasPropertyChanged<//TheType>(Type obj1, Type obj2, null);
}
}
另外,这部分代码让我很烦。如果我不调用 tostring 方法,我会得到一些奇怪的结果,比如 id 63633 不等于 63633
object val1 = Original.GetType().GetProperty(p.Name).GetValue(Original, null);
object val2 = Modified.GetType().GetProperty(p.Name).GetValue(Modified, null);
if (!IgnoreProperties.Contains(p.Name) &&
val1 != null && val2 != null &&
val1.ToString() != val2.ToString())
{
return true;
}
这里是完整的。
private bool HasPropertyChanged<T>(T Original, T Modified, string[] IgnoreProperties)
{
if (Original == null || Modified == null)
return false;
if (IgnoreProperties == null)
IgnoreProperties = new string[] { };
IEnumerable<PropertyInfo> properties = typeof(T).GetProperties();
foreach (var p in properties)
{
if (p.GetType() == typeof(System.Collections.Generic.List<>))
{
foreach (var blah in //the list)
{
HasPropertyChanged<//TheType>(Type obj1, Type obj2, null);
}
}
object val1 = Original.GetType().GetProperty(p.Name).GetValue(Original, null);
object val2 = Modified.GetType().GetProperty(p.Name).GetValue(Modified, null);
if (!IgnoreProperties.Contains(p.Name) &&
val1 != null && val2 != null &&
val1.ToString() != val2.ToString())
{
return true;
}
}
return false;
}
最佳答案
因为你在运行时处理类型,你应该有一个非通用版本的函数,它接受一个 Type
参数:
private bool HasPropertyChanged<T>(T Original, T Modified, string[] IgnoreProperties)
{
return HasPropertyChanged(typeof(T), Original, Modified, IgnoreProperties);
}
private bool HasPropertyChanged(Type T, object Original, object Modified, string[] IgnoreProperties)
{
// ...
}
这样,您就可以调用列表元素的方法了:
if (p.PropertyType.IsGenericType && p.PropertyType.GetGenericTypeDefinition() == typeof(System.Collections.Generic.List<>))
{
object val1 = p.GetValue(Original, null);
object val2 = p.GetValue(Modified, null);
// First check count...
PropertyInfo countProperty = p.PropertyType.GetProperty("Count");
int count1 = countProperty.GetValue(val1, null);
int count2 = countProperty.GetValue(val2, null);
if (count1 != count2) return true;
// Now iterate:
var enumerator1 = (val1 as System.Collections.IEnumerable).GetEnumerator();
var enumerator2 = (val2 as System.Collections.IEnumerable).GetEnumerator();
while (enumerator1.MoveNext())
{
enumerator2.MoveNext();
// check for null, skipping here...
object elem1 = enumerator1.Current;
object elem2 = enumerator2.Current;
if (HasPropertyChanged(elem1.GetType(), elem1, elem2, IgnoreProperties)) return true;
}
}
// ...
关于c# - 一般比较对象的属性,用一点递归来启动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10643878/
我是一名优秀的程序员,十分优秀!