来自ReflectionHelper
的{{1}} ...
Microsoft.Practices.Unity.InterceptionExtension
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:ValidateArgumentsOfPublicMethods",
Justification = "Validation done by Guard class")]
public static TAttribute[] GetAttributes<TAttribute>(MemberInfo member, bool inherits) where TAttribute : Attribute
{
Microsoft.Practices.Unity.Utility.Guard.ArgumentNotNull(member, "member");
IEnumerable<Object> attributesAsObjects = member.GetCustomAttributes(typeof(TAttribute), inherits);
TAttribute[] attributes = new TAttribute[attributesAsObjects.Count()];
int index = 0;
attributesAsObjects.ForEach(attr =>
{
var a = (TAttribute) attr;
attributes[index++] = a;
});
return attributes;
}
public static IEnumerable<T> ForEach<T>(this IEnumerable<T> enumeration, Action<T> action)
{
foreach (T item in enumeration)
{
action(item);
yield return item;
}
}
包含一个元素。 attributesAsObjects
包含一个元素,但它是attributes
。 ForEach块(我已经扩展)似乎没有运行 - 断点没有被击中。
这巫术是什么?
calling code,导致null
....
attr
以下是protected override IEnumerable<ICallHandler> DoGetHandlersFor(MethodImplementationInfo member, IUnityContainer container)
{
if (member.InterfaceMethodInfo != null)
{
foreach (HandlerAttribute attr in ReflectionHelper.GetAllAttributes<HandlerAttribute>(member.InterfaceMethodInfo, true))
{
yield return attr.CreateHandler(container);
}
}
foreach (HandlerAttribute attr in ReflectionHelper.GetAllAttributes<HandlerAttribute>(member.ImplementationMethodInfo, true))
{
yield return attr.CreateHandler(container);
}
}
...(请注意最后调用GetAllAttributes
。)
ToArray
答案 0 :(得分:5)
这巫术是什么?
它被称为&#34;延迟执行&#34;并且基本上意味着如果你实际上没有枚举IEnumerable<T>
,它就不会被执行。
详细说明:
public static IEnumerable<T> ForEach<T>(this IEnumerable<T> enumeration, Action<T> action)
{
foreach (T item in enumeration)
{
action(item);
yield return item;
}
}
此方法危险。它在你身边。它的使用方式支持我的理论:错误。
new[]{ 6, 7 }.ForEach(Console.WriteLine);
这条线做什么? 没有!为什么?因为您需要具体化结果才能实际执行任何代码:
new[]{ 6, 7 }.ForEach(Console.WriteLine).ToList();
此将打印6
和7
。
同样,此代码段:
attributesAsObjects.ForEach(attr =>
{
var a = (TAttribute) attr;
attributes[index++] = a;
});
没有。由于结果未实现,因此不会执行代码。