类型.GetType方法返回空值



我在这个命名空间中有一个enum:

Andish.CSS.CommonSilverLight.Enum.Billing.AccountTransacts.AccountTransactAccountType

…我使用此方法将数据集转换为类:

public List<T> ConvertTo<T>(DataTable datatable) where T : new()
    {
        var temp = new List<T>();
        try
        {
            var columnsNames = (from DataColumn dataColumn in datatable.Columns select dataColumn.ColumnName).ToList();
            temp = datatable.AsEnumerable().ToList().ConvertAll<T>(row => GetObject<T>(row, columnsNames));
            return temp;
        }
        catch
        {
            return temp;
        }
    }
 private T GetObject<T>(DataRow row, List<string> columnsName) where T : new()
    {
        T obj = new T();
        try
        {
            string columnname = "";
            string value = "";
            PropertyInfo[] Properties = typeof(T).GetProperties();
            foreach (PropertyInfo objProperty in Properties)
            {
                columnname = columnsName.Find(name => name.ToLower() == objProperty.Name.ToLower());
                if (!string.IsNullOrEmpty(columnname))
                {
                    value = row[columnname].ToString();
                    if (!string.IsNullOrEmpty(value))
                    {
                        if (Nullable.GetUnderlyingType(objProperty.PropertyType) != null)
                        {
                            value = row[columnname].ToString().Replace("$", "").Replace(",", "");
                            objProperty.SetValue(obj, Convert.ChangeType(value,
                                Type.GetType(Nullable.GetUnderlyingType(objProperty.PropertyType).ToString())), null);
                        }
                        else
                        {
                            value = row[columnname].ToString().Replace("%", "");
                            objProperty.SetValue(obj, Convert.ChangeType(value,
                                Type.GetType(objProperty.PropertyType.ToString())), null);
                        }
                    }
                }
            }
            return obj;
        }
        catch
        {
            return obj;
        }
    }

但是,当我调试代码时,数据集中有一个int列转换为enum属性,这一行:

objProperty.SetValue(obj, Convert.ChangeType(value,
    Type.GetType(Nullable.GetUnderlyingType(objProperty.PropertyType).ToString())), null);

…返回错误:

Value cannot be null.
Parameter name: conversionType

…发现:

Nullable.GetUnderlyingType(objProperty.PropertyType).ToString()
==
"Andish.CSS.CommonSilverLight.Enum.Billing.AccountTransacts.AccountTransactAccountType"
Type.GetType(Nullable.GetUnderlyingType(objProperty.PropertyType).ToString())
==
null

为什么Type.GetType没有得到我枚举的类型?

直接使用Nullable.GetUnderlyingType(objProperty.PropertyType)

先在上面调用ToString(),然后在字符串输出上使用Type.GetType(...)是没有用的!

(当然,在else块中也会犯同样的错误;用objProperty.PropertyType代替Type.GetType(objProperty.PropertyType.ToString())

不考虑您的代码,Type.GetType的文档说明:

参数

typeName

要获取的类型的程序集限定名。看到AssemblyQualifiedName。如果类型在当前执行的程序集中或Mscorlib.dll中,则提供由其命名空间限定的类型名称就足够了。

…<标题> 返回值

指定名称的类型,如果找到;否则,null。

我特别强调。

假定该类型不在当前执行的程序集中,因此需要使用该类型的程序集限定名称。而不是调用ToString(),尝试使用AssemblyQualifiedName属性。

我修改了我的代码:

private T GetObject<T>(DataRow row, List<string> columnsName) where T : new()
    {
        T obj = new T();
        try
        {
            string columnname = "";
            PropertyInfo[] Properties = typeof(T).GetProperties();
            foreach (PropertyInfo objProperty in Properties)
            {
                columnname = columnsName.Find(name => name.ToLower() == objProperty.Name.ToLower());
                if (!string.IsNullOrEmpty(columnname))
                {
                    var value = row[columnname];
                    if (!string.IsNullOrEmpty(value.ToString()))
                    {
                        Type type;
                        type = Nullable.GetUnderlyingType(objProperty.PropertyType) ?? objProperty.PropertyType;
                        objProperty.SetValue(obj,
                                             type == value.GetType()
                                                 ? Convert.ChangeType(value, type)
                                                 : System.Enum.ToObject(type, value), null);
                    }
                }
            }
            return obj;
        }
        catch (Exception exception)
        {
            return obj;
        }
    }

相关内容

  • 没有找到相关文章

最新更新