C#:使用反射从泛型类型创建元组

时间:2017-11-22 10:56:04

标签: c# generics reflection tuples

我希望能够将Tuple传递给以下方法,但是我不能将其实例化。

    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;
    }

正如我在评论中所说,我正在尝试构建一个裸骨ORM,我只对映射到对象部分感兴趣。它按原样工作,但有时快速查询能够传递元组而不是完整的类是实用的。

有没有解决方案?

1 个答案:

答案 0 :(得分:0)

这种方式不起作用。由于许多原因,创建一个从数据库生成 任何 的方法并不是一个好的解决方案。

这样做的正确方法会有点复杂。我认为你需要一个工厂界面,如下所示:

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());

通过这种方式,您可以将数据从数据库转换为与对象创建逻辑分离的对象。