我希望能够将元组传递给以下方法,但是我不能实例化。
public List<T> Select<T>(string sql, DbCommand command) where T : new()
{
DbDataReader dataReader = null;
List<T> ls = new List<T>();
Type tType = typeof(T);
T t;
PropertyInfo prop = null;
string[] propertiesNames = GetPropertiesNamesFromSQL(sql);
try
{
dataReader = command.ExecuteReader();
if (dataReader == null || !dataReader.HasRows) return ls;
while (dataReader.Read())
{
t = new T();
for (int i = 0; i < dataReader.FieldCount; i++)
{
prop = tType.GetProperty(propertiesNames[i]);
prop.SetValue(t, dataReader.GetValue(i));
}
ls.Add(t);
}
}
catch (Exception){ }
finally
{
if (dataReader != null) dataReader.Close();
}
return ls;
}
正如我在评论中所说的那样,我正在尝试建立一个裸露的骨头,我只对映射到对象部分感兴趣。它的工作原样,但是有时快速查询能够通过元组而不是全班是实用的。
是否有解决方案?
它不起作用。创建一种将生成的方法。 做到这一点的正确方法会更加复杂。我认为您需要一个工厂界面,这样: 然后是一个混凝土工厂: 然后将其传递给您的方法: 然后,您可以将您的方法称为: 这样,您将数据从数据库转换为与对象创建逻辑分开的对象。public interface IMyFactory<T> where T : new()
{
T Create ( string name );
}
public class MyFactory : IMyFactory<MyClient>
{
public MyClient Create ( string name )
{
var t = new MyClient();
t.ClientName = name;
return t;
}
}
public List<T> SelectFromDataBase<T> ( IMyFactory<T> factory ) where T : new()
{
var ls = new List<T>();
// highly simplified here
T t = factory.Create("Mr Smith");
ls.Add(t);
return ls;
}
var myList = SelectFromDataBase(new MyFactory());