我有个反射的问题,求大神解惑

andyshao520 2012-03-26 02:59:37
我有个

public class A
{
public int AID{get;set;}
public IList<B> BList{get;set;}
}


public class B
{
public int BID{get;set;}
public IList<C> CList{get;set;}
}

public class C
{
public int CID{get;set;}
}

static void Main(string[] args)
{
IList<A> aList = new List<A>();
aList.Add(new A { AID = 1, BList = new List<B>() { new B{BID=1}} });
aList.Add(new A { AID = 2, BList = new List<B>() { new B { BID = 2 } } });
EqualityComparer<A> eq = new EqualityComparer<A>();
//eq.ComparerString.Add("AID");
eq.ComparerString.Add("BList");
bool isExists = aList.Contains(new A { BList = new List<B>() { new B { BID = 1 } } }, eq);
Console.WriteLine(isExists);
}

然后 有个比较类
public class EqualityComparer<T> : IEqualityComparer<T>
{
/// <summary>
/// 需要比较的属性名称
/// </summary>
public IList<string> ComparerString
{
get;
set;
}

public EqualityComparer()
{
ComparerString = new List<string>();
}

public bool Equals(T a, T b)
{
if (object.ReferenceEquals(a, b))
return true;
if (object.ReferenceEquals(a, null) || object.ReferenceEquals(b, null))
return false;

if (ComparerString == null || ComparerString.Count <= 0)
{
bool isSame = false;
foreach (PropertyInfo p in a.GetType().GetProperties())
{
if (p.PropertyType.IsGenericType)
{
if (!IsListSame(p.GetValue(a, null), b.GetType().GetProperty(p.Name).GetValue(b, null)))
return false;
}
else
{
isSame = p.GetValue(a, null) == b.GetType().GetProperty(p.Name).GetValue(b, null);
if (!isSame)
return false;
}
}
return true;
}
else
{
foreach (string str in ComparerString)
{
if (a.GetType().GetProperty(str).PropertyType.IsGenericType)
{
if (!IsListSame(a.GetType().GetProperty(str).GetValue(a, null), b.GetType().GetProperty(str).GetValue(b, null)))
return false;
}
else
{
if (a.GetType().GetProperty(str).GetValue(a, null) != b.GetType().GetProperty(str).GetValue(b, null))
return false;
}
}
return true;
}
}

private bool IsListSame(object oa,object ob)////这个比较IList 怎么比较 不知道类型 怎么弄?
{
IList<object> a=new List<object>();
IList<object> b = new List<object>();



foreach (object suba in a)
{
if (b.Contains(suba))
return true;
}
return false;
}

public int GetHashCode(T o)
{
if (object.ReferenceEquals(o, null))
return 0;
int hashResult = 0;
if (ComparerString == null || ComparerString.Count <= 0)
{

foreach (PropertyInfo p in o.GetType().GetProperties())
{
hashResult = hashResult ^ (p.GetValue(o, null) != null ? p.GetValue(o, null).GetHashCode() : 0);
}
return hashResult;
}
else
{
foreach (string str in ComparerString)
{
hashResult = hashResult ^ (o.GetType().GetProperty(str).GetValue(o, null) != null ? o.GetType().GetProperty(str).GetValue(o, null).GetHashCode() : 0);
}
return hashResult;
}
}
}


但是问题就卡在了IList类型的属性怎么比较 反射怎么弄?
不会
求各位大神讲解
...全文
568 58 打赏 收藏 转发到动态 举报
写回复
用AI写文章
58 条回复
切换为时间正序
请发表友善的回复…
发表回复
lovexiu0924 2012-04-06
  • 打赏
  • 举报
回复
你要类去强制继承 抽象类接口是一个方法 但是问题就会出现 不是所有的对象对会有这个比较条件 比较条件不同了 你的抽象类 接口的里面的东西也会不同 而且也挺繁琐的
不是很好用
简单的用下反射 去设计一些简单的模块
我觉得还行
蔡袅 2012-04-04
  • 打赏
  • 举报
回复
[Quote=引用 53 楼 的回复:]

反射到底是神马???我就听说反射 很慢。。很慢,,,
[/Quote]我们程序用了不少反射,没见得慢 感觉不出来
he110w0rld 2012-04-03
  • 打赏
  • 举报
回复
大婶来看看啊
orochiheart 2012-04-02
  • 打赏
  • 举报
回复
反射到底是神马???我就听说反射 很慢。。很慢,,,
  • 打赏
  • 举报
回复
使用恰好足够的接口或者类型来编程,不要空洞地设计程序。过分解释性地、没有必要反射时去反射,你的程序越来越诡异了。
蔡袅 2012-04-02
  • 打赏
  • 举报
回复
反射,无非就是以Type为中心,运行时操作Type
yuandonghuia 2012-04-02
  • 打赏
  • 举报
回复
如果要比较Name属性的话,你可以强制你下面所有的类从一个带Name的接口继承,比较时强制转化为接口就行了。你所想的正是我前几天所推翻的。我要检测下面反射生成的类是否包含一个事件,如果有,注册,开始用的反射。。。后来怎么看怎么别扭,后来想到了接口,我也觉得,反射是实在没有办法的办法,但凡有办法,就别用反射。丢了强类型的特性了,如果特别喜欢反射,我觉得弱类型语言更适合你。
ktei2008 2012-04-02
  • 打赏
  • 举报
回复
Keep your design simple and clear. Don't confuse yourself later on.
lovexiu0924 2012-04-01
  • 打赏
  • 举报
回复
我只是觉得用反射 做这种简单的获取赋值 比较会比较方便 代码的重用性比较高
言多必失 2012-04-01
  • 打赏
  • 举报
回复
这个代码写的不错,刚刚也在看反射,只能看懂,运用还不是很熟练的。
lovexiu0924 2012-04-01
  • 打赏
  • 举报
回复
数组有一定的局限性 泛型比数组好用
RKO 2012-04-01
  • 打赏
  • 举报
回复
public class A
{
public int AID{get;set;}
public IList<B> BList{get;set;}
}


public class B
{
public int BID{get;set;}
public IList<C> CList{get;set;}
}
加下面这些应该可以了
public class A1
{
public int AID{get;set;}
public B[] BList{get;set;}
}


public class B1
{
public int BID{get;set;}
public [] CList{get;set;}
}
wanghui0380 2012-03-31
  • 打赏
  • 举报
回复
额,我只能说你在玩一个不应该玩的动作

IEqualityComparer<T>本身就是一个场合性的东西,也就是说他本来就应该和上下文关联的东西,而非通用滴玩意,请自己想一下微软为啥要重载出这么一个方法让你自己提供IEqualityComparer<T>,很明显就是微软说我不知道你要干啥,这不是通用标准,我做不出来。请你自己根据上下文实现。所以你企图用一个通用的玩意去包装的思维就和本身微软的思路是冲突滴,要能通用的化,微软何必要重载出这个方法给你呢??
qldsrx 2012-03-31
  • 打赏
  • 举报
回复
        foreach (PropertyInfo p in a.GetType().GetProperties())
{
var obj = p.GetValue(a, null);
if (obj is IList)
{
//转换为IList比较内部项
IList lobj = (IList)obj;
for (int i = lobj.Count - 1; i >= 0; i--)
{
var item = lobj[i];//得到内部项,怎么比较自己写
}
}
else
{
//常规比较
}
lovexiu0924 2012-03-31
  • 打赏
  • 举报
回复
我是循环a的属性来的啊
foreach (PropertyInfo p in a.GetType().GetProperties())
----------
a下面的BList
但是p是属性对象没办法通过索引获得到List里面的值
qldsrx 2012-03-31
  • 打赏
  • 举报
回复
我不是说了吗?如果是IList的对象,只要用索引访问器访问就可以得到内部值了,例如_List[0]将得到里面第一个项的值,它的类型是_List.GetType().GetGenericArguments()[0],当然,如果你的是IList<Object>,那么比较类型意义不大,直接通过这个项的值反射类型比较更好。
lovexiu0924 2012-03-31
  • 打赏
  • 举报
回复
我现在不知道怎么样比较IList的泛型类型和它里面的值
能给点代码提示一下吗?
谢谢了!
andyshao520 2012-03-31
  • 打赏
  • 举报
回复
谢谢!
我看看
lovexiu0924 2012-03-31
  • 打赏
  • 举报
回复
一样可以的啊 只不过是需要做下变通而已
只是简单的比较,我觉得这样子时没有问题的
如果你要那样写,我只会感觉代码的冗余
再说我写这个的前提只是在一个IList集合里面判断有没有指定条件重复的对象
如果你想判断其他的 A类型对象和B类型对象去比较的话 可以去做相应的变通
没有必要吧相同结构的代码重复写上个七八遍
没有什么意思
还有使用反射现在也大多是简单的比较和获取 太复杂的却是消耗性能而不是那么好写的
做最简单的比较我觉得还是可以使用的
qldsrx 2012-03-31
  • 打赏
  • 举报
回复
[Quote=引用 43 楼 的回复:]

有多个类型的对象,要比较对象中的Name属性的值是否存在(如果还有其他的属性要求比较的话)

==============

我只能告诉你在你费劲巴拉的搞这个通用解的时候

我的要求不是检查name值是否一样。 我告诉你对象A.name和对象B.username 比较

或者我要A.firstName+A.lastName和B.Name 比较

现在你还觉着你封装这块有通用性……
[/Quote]
他是在学习怎么玩反射,而不是在设计通用方法。
加载更多回复(37)

111,126

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧