Seeing from ,然后我们在评论中进行了讨论。 由于该博客仅用中文书写,我在此作简要解释。 生殖法:
[AttributeUsage(AttributeTargets.Class, Inherited = true, AllowMultiple = true)]
public abstract class BaseAttribute : Attribute
{
public string Name { get; set; }
}
public class FooAttribute : BaseAttribute { }
[Foo(Name = "A")]
[Foo(Name = "B")]
[Foo(Name = "C")]
public class Bar { }
//Main method
var attributes = typeof(Bar).GetCustomAttributes(true).OfType<FooAttribute>().ToList<FooAttribute>();
var getC = attributes.First(item => item.Name == "C");
attributes.Remove(getC);
attributes.ForEach(a => Console.WriteLine(a.Name));
该守则载有所有<代码>FooAttribute,删除了名称为“C”的代码。 产出显然是“A”和“B”? 如果一切顺利进行,你就没有看到这个问题。 事实上,你会从理论上获得“AC”“BC”或甚至正确的“AB”(I got AC在我的机器上,博客作者会到B)。 问题产生于在系统中实施GetHashCode/Equals。 人均 执行摘要:
[SecuritySafeCritical]
public override int GetHashCode()
{
Type type = base.GetType();
//*****NOTICE***** FieldInfo[] fields = type.GetFields(BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance);
object obj2 = null;
for (int i = 0; i < fields.Length; i++)
{
object obj3 = ((RtFieldInfo) fields[i]).InternalGetValue(this, false, false);
if ((obj3 != null) && !obj3.GetType().IsArray)
{
obj2 = obj3;
}
if (obj2 != null)
{
break;
}
}
if (obj2 != null)
{
return obj2.GetHashCode();
}
return type.GetHashCode();
}
它使用<代码>Type.Get Fields,因此忽视了从基类继承的财产,因此,“FooAttribute(然后是<代码>Remove方法有一个<>randomly)。 因此,问题是:是否有执行的特别理由? 或者这只是一个ug子吗?