目录

        public static string CleanHtml(string strHtml)
        {
            strHtml = Regex.Replace(strHtml, @"(\<script(.+?)\</script\>)|(\<style(.+?)\</style\>)", "", RegexOptions.IgnoreCase | RegexOptions.Singleline);
            //删除标签
            var r = new Regex(@"</?[^>]*>", RegexOptions.IgnoreCase);
            Match m;
            for (m = r.Match(strHtml); m.Success; m = m.NextMatch())
            {
                strHtml = strHtml.Replace(m.Groups[0].ToString(), "");
            }
            return strHtml.Trim();
        }

做项目时偶尔B类赋值给A类,碰巧A和B类型很多属性字段名是一样的,或者只是大小写不一样,这是可以利用泛型,反射来写一个自动化赋值的方法。

  • 一、前言
  • 澳门微尼斯人手机版 ,二、ConcurrentBag类
  • 三、
    ConcurrentBag线程安全实现原理

    • 1.
      ConcurrentBag的私有字段
    • 2.
      用于数据存储的TrehadLocalList类
    • 3.
      ConcurrentBag实现新增元素
    • 4. ConcurrentBag
      如何实现迭代器模式
  • 四、总结
  • 笔者水平有限,如果错误欢迎各位批评指正!

 

下面方法不考虑大小写不一样的情况,如果要考虑,可以使用字符串方法
ToUpper() 、ToLower() 后,对比字段名是否一样。


 public class MapperModel
    {
        /// <summary>
        /// B对象相同属性赋值给A对象, 
        /// </summary>
        /// <typeparam name="A">类型A</typeparam>
        /// <typeparam name="B">类型B</typeparam>
        /// <param name="b">B对象</param>
        /// <returns>返回创建的新A对象</returns>
        public static A Mapper<A, B>(B b)
        {
            A a = Activator.CreateInstance<A>();
            try
            {
                Type Typeb = b.GetType();//获得类型  
                Type Typea = typeof(A);
                foreach (PropertyInfo bp in Typeb.GetProperties())//获得类型的属性字段  
                {
                    foreach (PropertyInfo ap in Typea.GetProperties())
                    {
                        if (ap.Name == bp.Name)//判断属性名是否相同  
                        {                          
                            if (ap.GetSetMethod()!= null)
                            {
                                if (bp.GetGetMethod()!=null)
                                {
                                    ap.SetValue(a, bp.GetValue(b, null), null);//获得b对象属性的值复制给a对象的属性   }
                                }

                            }
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
            return a;
        }
    }

值得注意的地方,属性到底有没有Get或者Set方法 ?B属性Set访问器是非公共的或不存在
则会赋值时出现异常。同理:A属性如果 Get
访问器是非公共的或不存在,则取值时出现异常

一、前言

笔者最近在做一个项目,项目中为了提升吞吐量,使用了消息队列,中间实现了生产消费模式,在生产消费者模式中需要有一个集合,来存储生产者所生产的物品,笔者使用了最常见的List<T>集合类型。

由于生产者线程有很多个,消费者线程也有很多个,所以不可避免的就产生了线程同步的问题。开始笔者是使用lock关键字,进行线程同步,但是性能并不是特别理想,然后有网友说可以使用SynchronizedList<T>来代替使用List<T>达到线程安全的目的。于是笔者就替换成了SynchronizedList<T>,但是发现性能依旧糟糕,于是查看了SynchronizedList<T>的源代码,发现它就是简单的在List<T>提供的API的基础上加了lock,所以性能基本与笔者实现方式相差无几。

最后笔者找到了解决的方案,使用ConcurrentBag<T>类来实现,性能有很大的改观,于是笔者查看了ConcurrentBag<T>的源代码,实现非常精妙,特此在这记录一下。

因此上面使用了 GetSetMethod(),GetGetMethod()做判断。如果Get 、Set
访问器不能正常获取,则返回为null。

发表评论

电子邮件地址不会被公开。 必填项已用*标注