C# 实例的Gettype(),和类的typeof(),反色获取类的对象

都是为了获取类的引用的数据类型System.Type。

1、GetType()方法继承自Object,所以C#中任何对象都具有GetType()方法,x.GetType(),其中x为变量名

2、typeof(x)中的x,必须是具体的类名、类型名称等,不可以是变量名称

3、System.Type.GetType(),有两个重载方法

比如有这样一个变量i:
Int16 i = new Int16();

使用GetType(),i.GetType()返回值是Int16的类型,但是无法使用typeof(i),因为i是一个变量,

使用typeof(),则只能:typeof(Int32),返回的同样是Int16的类型。

枚举类的转换,String——枚举类,以串口中Parity为例

    objParity= (Parity)Enum.Parse(typeof(Parity), "9600");

获取类的Type属性,除了上面的使用实例获取,或者typeof,还有一种提供类的完整信息字符串,根据类名来获取Type

  //取得当前方法类全名 包括命名空间  

string classname = System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.FullName; //得到的是 命名空间.类

Type type = Type.GetType(classname); // 通过类名获取同名类
  object   obj = System.Activator.CreateInstance(type);       // 创建实例

Object对象转为实体类对象

private T ConvertObject<T>(object asObject) where T : new()
{
    //创建实体对象实例
    var t = Activator.CreateInstance<T>();
    if (asObject != null)
    {
        Type type = asObject.GetType();
        //遍历实体对象属性
        foreach (var info in typeof(T).GetProperties())
        {
            object obj = null;
            //取得object对象中此属性的值
            var val = type.GetProperty(info.Name)?.GetValue(asObject);
            if (val != null)
            {
                //非泛型
                if (!info.PropertyType.IsGenericType)
                    obj = Convert.ChangeType(val, info.PropertyType);
                else//泛型Nullable<>
                {
                    Type genericTypeDefinition = info.PropertyType.GetGenericTypeDefinition();
                    if (genericTypeDefinition == typeof(Nullable<>))
                    {
                        obj = Convert.ChangeType(val, Nullable.GetUnderlyingType(info.PropertyType));
                    }
                    else
                    {
                        obj = Convert.ChangeType(val, info.PropertyType);
                    }
                }
                info.SetValue(t, obj, null);
            }
        }
    }
    return t;
}

猜你喜欢

转载自www.cnblogs.com/FHL007/p/11113610.html