设为首页 加入收藏

TOP

动态建立类(一)
2017-10-10 12:31:57 】 浏览:1794
Tags:动态 建立

首先先发几个链接感谢下各位的技术分享:

http://www.cnblogs.com/longgel/archive/2010/05/14/1735590.html

http://www.cnblogs.com/yjmyzz/archive/2011/11/13/2247600.html

http://www.cnblogs.com/lichdr/archive/2004/10/21/55038.html

内容其实差不了多少,在此只是为了记录而已。

// --------------------------------------------------------
// 作者:李剑 msn:newshadowk@hotmail.com,这是源码作者,我只是copy过来改一改的
// --------------------------------------------------------

 
  

/// <summary>
/// 类帮助器,可以动态对类,类成员进行控制(添加,删除),目前只支持属性控制。
/// 注意,属性以外的其它成员会被清空,功能还有待完善,使其不影响其它成员。
/// </summary>

 public class DynamicClass
    {
        //公有方法
        #region 公有方法
        /// <summary>
        /// 根据类的类型型创建类实例。
        /// </summary>
        /// <param name="t">将要创建的类型。</param>
        /// <returns>返回创建的类实例。</returns>
        public static object CreateInstance(Type t)
        {
            return Activator.CreateInstance(t);
        }

        /// <summary>
        /// 根据类的名称,属性列表创建型实例。
        /// </summary>
        /// <param name="className">将要创建的类的名称。</param>
        /// <param name="lcpi">将要创建的类的属性列表。</param>
        /// <returns>返回创建的类实例</returns>
        public static object  CreateInstance(string className, List<CustPropertyInfo> lcpi)
        {
            Type t = SetObjectAndAddPropertyToType(className, lcpi);
            return Activator.CreateInstance(t);
        }
        
        /// <summary>
        /// 根据属性列表创建类的实例,默认类名为DefaultClass,由于生成的类不是强类型,所以类名可以忽略。
        /// </summary>
        /// <param name="lcpi">将要创建的类的属性列表</param>
        /// <returns>返回创建的类的实例。</returns>
        public static object CreateInstance(List<CustPropertyInfo> lcpi)
        {
            return CreateInstance("DefaultClass", lcpi);
        }

        /// <summary>
        /// 根据类的实例设置类的属性。
        /// </summary>
        /// <param name="classInstance">将要设置的类的实例。</param>
        /// <param name="propertyName">将要设置属性名。</param>
        /// <param name="propertSetValue">将要设置属性值。</param>
        public static void SetPropertyValue(object classInstance, string propertyName, object propertSetValue)
        {
            classInstance.GetType().InvokeMember(propertyName, BindingFlags.SetProperty,
                                          null, classInstance, new object[] { Convert.ChangeType(propertSetValue, propertSetValue.GetType()) });
        }

        public static void SetPropertyValue(object classInstance, ProPertyVale valueInfo)
        {
            var properties = classInstance.GetType().GetProperties();
            if (properties.Where(p => p.Name == valueInfo.Name).Count() <= 0)
                return;

            var item = properties.Single(p => p.Name == valueInfo.Name);
            item.SetValue(classInstance, StrToLevelEnum(valueInfo.Value));
        }

        public static St.Domain.Entity.LevelInfo StrToLevelEnum(string value)
        {
            int val = Convert.ToInt32(value);
            return (Domain.Entity.LevelInfo)val;
        }

        /// <summary>
        /// 根据类的实例获取类的属性。
        /// </summary>
        /// <param name="classInstance">将要获取的类的实例</param>
        /// <param name="propertyName">将要设置的属性名。</param>
        /// <returns>返回获取的类的属性。</returns>
        public static object GetPropertyValue(object classInstance, string propertyName)
        {
            return classInstance.GetType().InvokeMember(propertyName, BindingFlags.GetProperty,
                                                          null, classInstance, new object[] { });
        }
        #endregion

        // 私有方法
        #re
首页 上一页 1 2 3 4 下一页 尾页 1/4/4
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇从Redis生成数据表主键标识 下一篇Thread.Join 和 Task.Wait 方法

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目