C# Reflection and Linq

Linq

Aggregate 聚合

字符串替换

    //study<Aggregate>first => study-Aggregate-first
    
    var invalidFileName = Path.GetInvalidFileNameChars();
    var replaceResult = invalidFileName.Aggregate("study<Aggregate>first", (accmulate, result) => (accmulate.Replace(result, '-')));
    Console.WriteLine(replaceResult);
   

累加求和 1 - 100


    var list = Enumerable.Range(1,100);
    var result = list.Aggregate((a,b)=>(a+b));
    Console.WriteLine(string.Format("1 - 100 sum {0}",result));

Tips: 对于累加可以使用等差数列求和的方式.(end-start+1)*(end + start)/2

eg:

    return serviceFactory
                .GetInstances<IPipelineBehavior<TRequest, TResponse>>()
                .Reverse()
                .Aggregate((RequestHandlerDelegate<TResponse>) Handler, (next, pipeline) => () => pipeline.Handle((TRequest)request, cancellationToken, next))();

参考博客

Assembly

yield 参考 C#图解教程 356 page
Assembly.DefinedTypes 返回值为IEnumerable<Type>

要实现IEnumerable即实现 current MoveNext Reset 复杂类型实现起来会很繁琐

    class Program
    {
        static void Main(string[] args)
        {
            HelloCollection helloCollection = new HelloCollection();
            foreach (string s in helloCollection)
            {
                Console.WriteLine(s);
            }

            Console.ReadKey();
        }
    }

    //public class HelloCollection : IEnumerable
    //{
    //    public IEnumerator GetEnumerator()
    //    {
    //        yield return "Hello";
    //        yield return "World";
    //    }
    //}

    public class HelloCollection : IEnumerable
    {
        public IEnumerator GetEnumerator()
        {
            Enumerator enumerator = new Enumerator(0);
            return enumerator;
        }

        public class Enumerator : IEnumerator, IDisposable
        {
            private int state;
            private object current;

            public Enumerator(int state)
            {
                this.state = state;
            }

            public bool MoveNext()
            {
                switch (state)
                {
                    case 0:
                        current = "Hello";
                        state = 1;
                        return true;
                    case 1:
                        current = "World";
                        state = 2;
                        return true;
                    case 2:
                        break;
                }
                return false;
            }

            public void Reset()
            {
                throw new NotSupportedException();
            }

            public object Current
            {
                get { return current; }
            }

            public void Dispose()
            {
            }
        }
    }
}

只访问ARRAY的前8个数据,做如下修改.yield break跳出迭代

public IEnumerator GetEnumerator()
{
    for (int i = 0; i < 10; i++)
    {
        if (i < 8)
        {
            yield return array[i];
        }
        else
        {
            yield break;
        }
    }
}

Reflection

TryAddTransient 根据ServiceType进行判断,已存在的服务不再添加
AddTransient 每个服务都将创建不同的实例
IsGenericType 是否是泛型
IsGenericTypeDefinition 是否可以用于泛型构建
ContainsGenericParameters 是否是开放性泛型 无法为开放性泛型构建新实例
GetGenericTypeDefinition() 获取相关泛型类型(开放类型)
IsAssignableFrom :typeof(Animal).IsAssignableFrom(typeof(Dog)) is True explain Dog implementation Animal

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 参考文献《极简生活:简而而美的活》 养生、保健、护肤、美容这些名词感觉是不是离自己特别远,总觉得自己还很年轻,没有...
    进化的小白阅读 196评论 0 1
  • 今天出差到庆云和乐陵,庆云那边信誉楼和奥城两个商场,都不错,信誉楼那边说不看货没法进,她们有主要的些供应商,暂时不...
    c6397a55fadf阅读 262评论 0 0
  • 【你是否到了“谈爱己老,谈老太早”的年纪?】 不知不觉就到了, 这是个令人尴尬的年龄, 谈爱己老,谈老太早。...
    思颖splendid阅读 739评论 0 5
  • 小蘑菇,你要和谁煮一起呀? 小虾米呀,海鲜菌菇! 那我们会永远煮在一起吗? 会的呀,跨过永远那么远,光年那么久,好...
    铛铛超阅读 365评论 1 7