同じプロパティを持つ 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);