0

この名前空間に列挙型があります:

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;
        }
    }

ただし、コードをデバッグしていて、データセットにenumプロパティに変換するint列が1つある場合、次の行になります。

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私の列挙型のタイプを取得しないのですか?

4

3 に答える 3

5

Nullable.GetUnderlyingType(objProperty.PropertyType)直接使用するだけです。

最初にそれを呼び出してから、文字列出力でToString()使用するのは無意味です!Type.GetType(...)

else(もちろん、ブロックでも同じ間違いを犯します。代わりにType.GetType(objProperty.PropertyType.ToString())、を使用してobjProperty.PropertyTypeください。)

于 2013-03-17T08:25:24.517 に答える
2

コードを無視すると、次の状態のドキュメントがあります。Type.GetType

パラメーター

typeName

取得するタイプのアセンブリ修飾名AssemblyQualifiedNameを参照してください。タイプが現在実行中のアセンブリまたはMscorlib.dllにある場合は、名前空間で修飾されたタイプ名を指定するだけで十分です。

..。

戻り値

..。

指定された名前のタイプ(見つかった場合)。それ以外の場合はnull。

強調鉱山。

おそらく、その型は現在実行中のアセンブリに含まれていないため、アセンブリで修飾された型の名前を使用する必要があります。を呼び出す代わりに、プロパティToString()を使用してみてください。AssemblyQualifiedName

于 2013-03-17T08:12:09.690 に答える
1

私は私のコードをこれに変更することでこの問題を修正しました:

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;
        }
    }
于 2013-03-17T11:45:51.067 に答える