我對泛型和反射的經驗非常少。我從下面的例子中假定的是,它需要太多的時間來執行。有沒有辦法讓我不使用反射來完成以下操作..替代反射
場景 我正在研究一種通用的方法。它需要一個傳遞給它的類的實例,並從所有屬性中生成SqlParameters。以下是稱爲「Store」的泛型方法的代碼,以及另一種將c#類型轉換爲DbType的SqlDbType的方法。
List<SqlParameter> parameters = new List<SqlParameter>();
public T Store<T>(T t)
{
Type type = t.GetType();
PropertyInfo[] props = (t.GetType()).GetProperties();
foreach (PropertyInfo p in props)
{
SqlParameter param = new SqlParameter();
Type propType = p.PropertyType;
if (propType.BaseType.Name.Equals("ValueType") || propType.BaseType.Name.Equals("Array"))
{
param.SqlDbType = GetDBType(propType); //e.g. public bool enabled{get;set;} OR public byte[] img{get;set;}
}
else if (propType.BaseType.Name.Equals("Object"))
{
if (propType.Name.Equals("String"))// for string values
param.SqlDbType = GetDBType(propType);
else
{
dynamic d = p.GetValue(t, null); // for referrences e.g. public ClassA obj{get;set;}
Store<dynamic>(d);
}
}
param.ParameterName = p.Name;
parameters.Add(param);
}
return t;
}
// mehthod for getting the DbType OR SqlDbType from the type...
private SqlDbType GetDBType(System.Type type)
{
SqlParameter param;
System.ComponentModel.TypeConverter tc;
param = new SqlParameter();
tc = System.ComponentModel.TypeDescriptor.GetConverter(param.DbType);
if (tc.CanConvertFrom(type))
{
param.DbType = (DbType)tc.ConvertFrom(type.Name);
}
else
{
// try to forcefully convert
try
{
param.DbType = (DbType)tc.ConvertFrom(type.Name);
}
catch (Exception e)
{
switch (type.Name)
{
case "Char":
param.SqlDbType = SqlDbType.Char;
break;
case "SByte":
param.SqlDbType = SqlDbType.SmallInt;
break;
case "UInt16":
param.SqlDbType = SqlDbType.SmallInt;
break;
case "UInt32":
param.SqlDbType = SqlDbType.Int;
break;
case "UInt64":
param.SqlDbType = SqlDbType.Decimal;
break;
case "Byte[]":
param.SqlDbType = SqlDbType.Binary;
break;
}
}
}
return param.SqlDbType;
}
要叫我的方法假設我有2類如下
public class clsParent
{
public int pID { get; set; }
public byte[] pImage { get; set; }
public string pName { get; set; }
}
and
public class clsChild
{
public decimal childId { get; set; }
public string childName { get; set; }
public clsParent parent { get; set; }
}
and this is a call
clsParent p = new clsParent();
p.pID = 101;
p.pImage = new byte[1000];
p.pName = "John";
clsChild c = new clsChild();
c.childId = 1;
c.childName = "a";
c.parent = p;
Store<clsChild>(c);
由於您正在迭代未知類型的屬性並獲取有關這些屬性的信息,因此我認爲您沒有任何方法可以避免此處的反射,實際上,您當前對泛型的使用似乎沒有提供任何服務目的。你可能只需要一個'object'參數:'public void Store(object t)' – JLRishe
@JLRishe它不是我想要完成的方法的完整版本,但未知類型的方式是處理是明確的這種方法...我已經搜索了很多唯一的問題「時間」,但沒有找到任何解決方案...我想用這種方法使用ADO.Net –
@AbdulMajid:不是一種選擇,但只有一個建議:如果類型在運行時重複存儲,您可以嘗試通過引入一些緩存來調整反射方法。你可以從Type.GetProperties()緩存返回的數組。對於要分配或轉換值的部分,您可以嘗試在Func <>實例中緩存邏輯並重用它們。 –