zoukankan      html  css  js  c++  java
  • C# 反射设置属性帮助类

    来源:https://github.com/zhangjk1980/ModbusTcpControl_WPF

        using System;
        using System.Collections.Generic;
        using System.Linq;
        using System.Text;
        public static class PropertyMethodExtensions
        {
            #region[Property]
            public static object GetProperty(this object instance, string propertyname)
            {
                BindingFlags flag = BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public;
                Type type = instance.GetType();
                PropertyInfo field = type.GetProperty(propertyname, flag);
                object o = field.GetValue(instance, null);
                return o;
            }
    
            /// <summary>
            /// 设置相应属性的值
            /// </summary>
            /// <param name="entity">实体</param>
            /// <param name="fieldName">属性名</param>
            /// <param name="o">值(对象)</param>
            public static void SetProperty(this object entity, string fieldName, object o)
            {
                BindingFlags flag = BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Default;
                Type entityType = entity.GetType();
                PropertyInfo propertyInfo = entityType.GetProperty(fieldName, flag);
                if (propertyInfo == null)
                    return;
    
                propertyInfo.SetValue(entity, o, null);
                
            }
    
            /// <summary>
            /// 设置相应属性的值
            /// </summary>
            /// <param name="entity">实体</param>
            /// <param name="fieldName">属性名</param>
            /// <param name="fieldValue">属性值</param>
            public static void SetProperty(this object entity, string fieldName, string fieldValue)
            {
                BindingFlags flag = BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Default;
                Type entityType = entity.GetType();
                PropertyInfo propertyInfo = entityType.GetProperty(fieldName, flag);
                if (propertyInfo == null)
                    return;
    
                if (IsType(propertyInfo.PropertyType, "System.String"))
                {
                    propertyInfo.SetValue(entity, fieldValue, null);
                    return;
                }
                if (IsType(propertyInfo.PropertyType, "System.Boolean"))
                {
                    propertyInfo.SetValue(entity, Boolean.Parse(fieldValue), null);
                    return;
                }
                if (IsType(propertyInfo.PropertyType, "System.UInt16"))
                {
                    if (fieldValue != "")
                        propertyInfo.SetValue(entity, ushort.Parse(fieldValue), null);
                    else
                        propertyInfo.SetValue(entity, 0, null);
    
                    return;
                }
                if (propertyInfo.PropertyType.BaseType.ToString().Equals("System.Enum"))
                {
                    if (fieldValue != "")
                        propertyInfo.SetValue(entity, Enum.Parse(propertyInfo.PropertyType,fieldValue), null);
                    else
                        propertyInfo.SetValue(entity, 0, null);
    
                    return;
                }
                if (IsType(propertyInfo.PropertyType, "System.Int32"))
                {
                    if (fieldValue != "")
                        propertyInfo.SetValue(entity, int.Parse(fieldValue), null);
                    else
                        propertyInfo.SetValue(entity, 0, null);
    
                    return;
                }
                if (IsType(propertyInfo.PropertyType, "System.Decimal"))
                {
                    if (fieldValue != "")
                        propertyInfo.SetValue(entity, Decimal.Parse(fieldValue), null);
                    else
                        propertyInfo.SetValue(entity, new Decimal(0), null);
    
                    return;
                }
                if (IsType(propertyInfo.PropertyType, "System.Nullable`1[System.DateTime]"))
                {
                    if (fieldValue != "")
                    {
                        try
                        {
                            propertyInfo.SetValue(
                                entity,
                                (DateTime?)DateTime.ParseExact(fieldValue, "yyyy-MM-dd HH:mm:ss", null), null);
                        }
                        catch
                        {
                            propertyInfo.SetValue(entity, (DateTime?)DateTime.ParseExact(fieldValue, "yyyy-MM-dd", null), null);
                        }
                    }
                    else
                        propertyInfo.SetValue(entity, null, null);
    
                    return;
                }
            }
    
            /// <summary>
            /// 类型匹配
            /// </summary>
            /// <param name="type"></param>
            /// <param name="typeName"></param>
            /// <returns></returns>
            public static bool IsType(Type type, string typeName)
            {
                if (type.ToString() == typeName)
                    return true;
                if (type.ToString() == "System.Object")
                    return false;
                return IsType(type.BaseType, typeName);
            }
            #endregion
    
            #region[Method]
            public static MethodInfo getPublicMothod(this object instance, string methodName)
            {
                BindingFlags flag = BindingFlags.Instance | BindingFlags.Public;
                Type type = instance.GetType();
                MethodInfo field = type.GetMethod(methodName, flag);
                return field;
            }
            #endregion
        }
    
    没有标记转载的情况下,如果有更好的优化麻烦电邮1808937496@qq.com或者留言答复,Thank You
  • 相关阅读:
    Java 线程间通信 —— 等待 / 通知机制
    Java 线程基础
    Java 内存模型
    Java 并发机制底层实现 —— volatile 原理、synchronize 锁优化机制、原子操作
    优秀程序员的博客有哪些?
    程序员五一被拉去相亲,结果彻底搞懂了HTTP常用状态码
    【Redis破障之路】三:Redis单线程架构
    【Redis破障之路】一:强大的Redis
    MySQL提升笔记(4)InnoDB存储结构
    MySQL提升笔记(3)日志文件详解
  • 原文地址:https://www.cnblogs.com/wandia/p/15242415.html
Copyright © 2011-2022 走看看