C#方法似乎没有运行

时间:2018-02-12 15:12:37

标签: c# unity-container

来自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

1 个答案:

答案 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();

将打印67

同样,此代码段:

attributesAsObjects.ForEach(attr =>
{
    var a = (TAttribute) attr;

    attributes[index++] = a;
});

没有。由于结果未实现,因此不会执行代码。