为什么System.Attribute的GetHashCode方法需要如此设计?
昨天我在实现《通过扩展改善ASP.NET MVC的验证机制[使用篇]》的时候为了Attribute 的一个小问题后耗费了大半天的精力,虽然最终找到了问题的症结并解决了问题,但是我依然不知道微软如此设计的目的何在。闲话少说,我们先来演示一下我具体遇到的问题如何发生的。
一、问题重现如下面的代码片断所示,我们定义了两个Attribute。其中抽象的BaseAttribute中定义了一个Name属性,而FooAttribute直接继承自BaseAttribute,并不曾定义任何属性和字段。在类型Bar上,我们应用了三个FooAttribute特性,其Name属性分别为A、B和C。 1: [Foo(Name = "A")] 3: [Foo(Name = "C")]
5: { 7: } 9: [AttributeUsage( AttributeTargets.Class,Inherited=true,AllowMultiple=true)] 11: { 13: } 15: { 1: var attributes = typeof(Bar).GetCustomAttributes(true).OfType<FooAttribute>().ToList<FooAttribute>(); 3: attributes.Remove(attribute); 1: B 1: FooAttribute attribute1 = new FooAttribute{ Name = "ABC" }; 3: Console.WriteLine("attribute1.Equals(attribute2) = {0}",attribute1.Equals(attribute2));
1: attribute1.Equals(attribute2) = True
typeof(FooAttribute)和FooAttribute对象之间对等性可以通过如下的输出结果看出来: 3: attribute1.GetHashCode() == typeof(FooAttribute).GetHashCode() = True
四、倘若为FooAttribute添加一个属性但是不要以为Attribute的GetHashCode方法总是返回类型本身的HashCode,如果我们在FooAttribute定义一个属性/字段,最终的对等性判断又会不同。为此我们在FooAttribute定义了一个Type属性。 2: {
4: } 然后我们在创建FooAttribute时指定其Type属性: int)};
1: attribute1.Equals(attribute2) = False typeof(FooAttribute).GetHashCode() = False 五、Attribute的GetHashCode方式是如何实现的?Attribute的HashCode是由定义在自身类型的字段值派生,不包括从基类继承下来的属性值。如果自身类型不曾定义任何字段,则直接使用类型的HashCode,这可以通过Attribute的GetHashCode方法的实现看出来,而Equals的逻辑与此类似。 2: override int GetHashCode()
4: Type type = base.GetType();
6: object obj2 = null; 8: { 10: if ((obj3 != null) && !obj3.GetType().IsArray) 12: obj2 = obj3; 14: if (obj2 != null) 16: break;
18: } 20: { 22: } 24: } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- 如何以编程方式将触发器添加到ASP.NET UpdatePanel?
- asp-classic – 是代码页65001和utf-8同样的东西吗?
- 有没有办法将内部控件放在ASP.NET自定义控件中?
- asp.net – 设置身份验证表单loginUrl动态?
- asp.net-mvc – ASP.NET MVC 5:使用站点模板无限重定向到登
- asp.net-mvc-4 – IE 10 Windows身份验证中的异步KendoUI上
- 循环遍历ASP.NET缓存对象中的键
- asp.net – 如何在Ember.js应用程序中使用ASP .NET Web API
- 当在ASP.NET中调用AppInitialize方法时?
- asp.net-mvc – 为什么Model Binding在我的POST动作方法中不
- asp.net-mvc – 属性路由不工作在区域
- asp.net – 视图状态中存储的项目的生命周期是多
- asp.net-mvc – MVC3中的CheckboxList查看并获取
- asp.net – 如何使用SignalR的跨域连接(CORS –
- asp.net-mvc-3 – 带有EF 4.1和EntityState.Modi
- asp.net-mvc-3 – 区域无法在MVC中加载 – 无法找
- ASP.Net(也许是MVC)网站的博客引擎
- 发布ASP.NET vNext / DNX与CLR类库结合使用
- asp.net-mvc – 使用MiniProfiler与MVC 5
- entity-framework-4 – ASP.NET MVC 3如何在Crea