[C#反射] 创建类/创建List /反射赋值/反射取值

    /// <summary>
    /// 创建一个类
    /// </summary>
    /// <param name="name">类名</param>
    /// <returns></returns>
    public static object CreateClass(string name){
        try
        {
            //获取已加载到此应用程序域的执行上下文中的程序集
            Assembly[] assemblies = AppDomain.CurrentDomain.GetAssemblies();
            Type type = null;
            //遍历查找传入的类名
            foreach (Assembly assembly in assemblies)
            {
                type = assembly.GetType(name);
                if(type != null){
                    break;
                }
            }
            if(type != null){
                //反射创建类
                return Activator.CreateInstance(type);
            }
        }
        catch (System.Exception)
        {
            Debug.LogError("CreateClass 创建失败 name:"+name);
        }
        return null;
    }
    /// <summary>
    /// 创建List
    /// </summary>
    /// <param name="type">泛型类型</param>
    /// <returns></returns>
    public static object CreateList(Type type){
        Type listType = typeof(List<>);
        //指定泛型的具体类型
        Type newType = listType.MakeGenericType(new Type[]{type});
        //创建一个list返回
        return Activator.CreateInstance(newType,new object[]{});
    }
    /// <summary>
    /// 通过反射赋值
    /// </summary>
    /// <param name="obj">需要赋值的类</param>
    /// <param name="name">赋值的字段名</param>
    /// <param name="type">字段类型</param>
    /// <param name="value">值</param>
    public static void SetMemberValue(object obj,string name,string type,string value){
        object val = null;
        PropertyInfo info = obj.GetType().GetProperty(name);
        switch (type)
        {
            case "int":
                val = Convert.ToInt32(value);
                break;
            case "float":
                val = Convert.ToSingle(value);
                break;
            case "bool":
                val = Convert.ToBoolean(value);
                break;
            case "string":
                val = value;
                break;
            case "enum":
                val = TypeDescriptor.GetConverter(info.PropertyType).ConvertFromInvariantString(value.ToString());
                break;
        }
        info.SetValue(obj,val);
    }
    /// <summary>
    /// 通过反射获得值
    /// </summary>
    /// <param name="obj"></param>
    /// <param name="name"></param>
    /// <param name="flags"></param>
    /// <returns></returns>
    public static object GetMemberValue(object obj,string name,BindingFlags flags =
    BindingFlags.Instance|BindingFlags.Public|BindingFlags.Static){
        Type type = obj.GetType();
        MemberInfo[] infos = type.GetMember(name,flags);
        switch(infos[0].MemberType){
            case MemberTypes.Field:
                return type.GetField(name,flags).GetValue(obj);//获取字段value值
            case MemberTypes.Property:
                return type.GetProperty(name,flags).GetValue(obj);//获取字段value值
            default:
                return null;
        }
    }

 

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值