私は、次の方法があります。汎用関数
私が見ることができるprivate Customer PopulateCustomerObject(object o, DataRow dataRow, Type type)
{
IDataStorable instance = (IDataStorable)AppDomain.CurrentDomain.CreateInstanceAndUnwrap(type.Assembly.FullName, type.FullName);
PropertyInfo[] proplist = type.GetProperties(BindingFlags.Instance | BindingFlags.Public);
Customer c = new Customer();
Guid customerGuid = new Guid(dataRow["AddressId"].ToString());
string view = ReflectionHelper.GetAttribute<DBObjectRetrieveAttribute>(type).View;
string query = string.Format("select * from {0} where id = '{1}'", view, customerGuid);
c = DataAccess.Retriever.Retrieve<Customer>(query);
return c;
}
private Address PopulateAddressObject(object o, DataRow dataRow, Type type)
{
IDataStorable instance = (IDataStorable)AppDomain.CurrentDomain.CreateInstanceAndUnwrap(type.Assembly.FullName, type.FullName);
PropertyInfo[] proplist = type.GetProperties(BindingFlags.Instance | BindingFlags.Public);
Address a = new Address();
Guid AddressGuid = new Guid(dataRow["PhysicalAddressId"].ToString());
string view = ReflectionHelper.GetAttribute<DBObjectRetrieveAttribute>(type).View;
string query = string.Format("select * from {0} where id = '{1}'", view, AddressGuid);
a = DataAccess.Retriever.Retrieve<Address>(query);
return a;
}
private Meter PopulateMeterObject(object o, DataRow dataRow, Type type)
{
IDataStorable instance = (IDataStorable)AppDomain.CurrentDomain.CreateInstanceAndUnwrap(type.Assembly.FullName, type.FullName);
PropertyInfo[] proplist = type.GetProperties(BindingFlags.Instance | BindingFlags.Public);
Meter m = new Meter();
Guid meterGuid = new Guid(dataRow["MeterId"].ToString());
string view = ReflectionHelper.GetAttribute<DBObjectRetrieveAttribute>(type).View;
string query = string.Format("select * from {0} where id = '{1}'", view, meterGuid);
m = DataAccess.Retriever.Retrieve<Meter>(query);
return m;
}
は最高の1つのジェネリックメソッドに置き換えられますが、どのよう:
private JobCard PopulateObject(JobCard jc, DataRow dataRow)
{
PropertyInfo[] proplist = jc.GetType().GetProperties();
foreach (PropertyInfo propertyitem in proplist)
{
if (propertyitem.Name != "")
if (propertyitem.PropertyType.BaseType.Namespace == "System")
{
propertyitem.SetValue(jc, dataRow[propertyitem.Name], null);
}
else
{
string typename = propertyitem.ToString().Replace("Pss.Common.Mia.", "");
int i = typename.IndexOf("Base");
typename = typename.Substring(0, i);
Type type = propertyitem.PropertyType;
switch (typename)
{
case "Customer":
propertyitem.SetValue(jc, PopulateCustomerObject(propertyitem, dataRow, type), null);
break;
case "Meter":
propertyitem.SetValue(jc, PopulateMeterObject(propertyitem, dataRow, type), null);
break;
case "TimeSheet":
propertyitem.SetValue(jc, PopulateTimeSheetObject(propertyitem, dataRow, type), null);
break;
}
}
}
return jc;
}
を上記の方法は、これらを呼び出しますか?
私はRetriever.Retrieveを変更することはできません1つの一般的なラインで
Customer c = new Customer();
Address a = new Address();
Meter m = new Meter();
TimeSheet t = new TimeSheet();
を交換する方法を見て、そしてまた
c = DataAccess.Retriever.Retrieve<Customer>(query);
a = DataAccess.Retriever.Retrieve<Address>(query);
m = DataAccess.Retriever.Retrieve<Meter>(query);
t = DataAccess.Retriever.Retrieve<TimeSheet>(query);
いけません。
private TPopulateAddressObject(object o, DataRow dataRow, Type type, string idColumnName) where T : IDataStorable, new()
{
IDataStorable instance = (IDataStorable)AppDomain.CurrentDomain.CreateInstanceAndUnwrap(type.Assembly.FullName, type.FullName);
PropertyInfo[] proplist = type.GetProperties(BindingFlags.Instance | BindingFlags.Public);
T obj = new T();
Guid id = new Guid(dataRow[idColumnName].ToString());
string view = ReflectionHelper.GetAttribute<DBObjectRetrieveAttribute>(type).View;
string query = string.Format("select * from {0} where id = '{1}'", view, id);
obj = DataAccess.Retriever.Retrieve<T>(query);
return obj;
}
いくつかのことを明確にしてください。 "Populate"メソッドで 'proplist'や' o'をどのように使うのかは明らかではありません。 'type'顧客/住所などですか?なぜ複雑なCreateInstanceAndUnwrapですか?また、SQLインジェクションに注意してください... –
また:propertyitem;あなたは 'o'としてそれを渡し、(別に)propertyitem.ToString()を呼び出す - これはどちらかというと良い考えではないと思います...何をしようとしていますか? –
callisto
早起き、coffeはまだ蹴られていませんが、プロプリストはこの問題の以前の試行から不要で、コピーされ貼り付けられています。したがって、CreateInstanceAndUnwrapも冗長です。顧客、住所、メーター、およびタイムシートはタイプです。 JobCardにはTimeSheet、Neter、Customer(Addressを含む)のSQLインジェクションが含まれています。これらのメソッドは、Webサービス –