-1

同じプロパティを持つ 3 つのオブジェクトがありますが、各オブジェクトには Id、Name、および TypeCode があります。データベースには、Id、Name、および TypeCode フィールドを含む最初のテーブルがあり、各オブジェクトの対応するプロパティをそれぞれ含む 3 つの他のテーブルがあります。

表 1: ID | 名前 | タイプコード

表 2: ID | 関数名

表 3: ID | 分析名

表 4: ID | プロパティ名

TypeCode に従ってオブジェクトのプロパティを返す「GetProperties」と呼ばれる storedProcdure があります。「GetProperties」は、オブジェクト ID である 1 つの引数を取ります。ストアド プロシージャを呼び出す前に TypeCode がわかりません。

TypeCode が関数の場合、次のフィールドが返されます。

ID、名前、TypeCode、FunctionName

TypeCode が Analysis の場合、次のフィールドが返されます。

ID、名前、TypeCode、AnalysisName

や。。など...

クラス MyObject から継承する FunctionObject、AnalysisObject、および PropertyObject の 4 つのクラスを作成しました。

public class MyObject
{
     public decimal Id;
     public string Name;
     public string TypeCode;
}

public class FunctionObject: MyObject
{
    public string FunctionName;
}

public class AnalysisObject: MyObject
{
    public string AnalysisName;
}

public class PropertyObject: MyObject
{
    public string PropertyName;
}

オブジェクトを動的に作成できる汎用関数を作成しました。

    public T GetObject<T>(string storedProcedure, List<DataBaseParameteres> parameters) where T: new()
{
    T result = new T();
    OpenConnection();
    SqlDataReader reader = ExecuteSqlCommand(storedProcedure, parameters);
    PropertyInfo[] properties = typeOf(T).GetProperties();

    if(reader.Read())
    {
        for(int i = 0; i<properties.Count(); i++)
        {
            object value = Convert.ChangeType(reader[properties[i].Name], properties[i].PropertyType);
            properties[i].SetValues(result, value, null);
        }
    }
    reader.Close();
    CloseConnection();
    return result;
}

この関数はうまく機能します。次のように呼び出すと、作成されたオブジェクトが返されます。

MyObject obj1 = GetObject<MyObject>(obj1Id);

私の問題は、汎用メソッド「GetObject」を変更して、FunctionObject、AnalysisObject、および Propertyobject というオブジェクトを作成する方法を知りたいということです。関数を呼び出すときに TypeCode について何も知らないので、TypeCode を持っていない限り、これを行うことはできません。

FunctionObject obj2 = GetObject<FunctionObject>(obj2Id);
4

1 に答える 1