0

私は次のように1つの選択を返す1つのストアドプロシージャを持っています:

select name , family , sex from person

私はこのような人を指名した1つのクラスを持っています:

 public class person {
         string name {get;set;}
         string family {get;set;}
         GenderEnum sex {get;set;}
       }

そして私はこのようなGenderEnumという名前の列挙型を1つ持っています:

Enum GenderEnum
{
Man = 1 ,
Woman = 2 ,
}

データテーブルをIListofPersonに変換したい。

私の問題は:セックス列をセックスフィールドに変換したいとき、私はほとんどの場合、タイプintをGenderEnumにキャストまたは変換します。

私はほとんどすべてのDataTableをすべてのクラスに変換するための1つの汎用メソッドを持っており、このメソッドは各プロパティが列挙型を持っていることを最も認識していることを忘れないでください。

このメソッドは、名前に従ってすべての列をすべてのプロパティにマップします

私はこのメソッドを書きますが、これはすべてのタイプで機能するわけではありません。

たとえば、列がintで、プロパティがstrinbeで同じ名前の場合、マップは機能しません。

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 = "";

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

2 に答える 2

4

このGetObjectメソッドで問題が発生していると思います。実行していることは非常に危険なので、EFまたは(事実上)他のORMに切り替える方がよいでしょう。このコードの保守性と可読性を考慮してください。しかし、あなたはおそらく締め切りのプレッシャーにさらされており、この段階ではそれについて多くを行うことができないことを理解しています。

問題をすばやく修正するには、Personクラスを次のように変更することを検討してください。

public class Person
{
    public String Name { get; set; }

    public String Family { get; set; }

    public Int32 Sex  { get; set; }

    public GenderEnum EnumeratedSex
    {
        get
        {
            return Sex == 1 ? GenderEnum.Man : GenderEnum.Woman;
        }
    }
}

public enum GenderEnum
{
    Man = 1,
    Woman = 2
}

あなたの性別フィールドはデータベース内の単なるintであると思いますが、そうでない場合は、それに応じて変更してください。

これが役に立ったら教えてください。

于 2013-03-27T14:46:25.353 に答える
1

これを行う代わりに、なぜこれにEntity Frameworkを使用しないのですか?参考までにこのリンクを参照してください

于 2013-03-27T10:24:35.430 に答える