如何在C#中创建未知/泛型类型列表?

时间:2016-03-29 09:46:12

标签: c# generics

我注意到我一遍又一遍地做同样的事情,想要创建一个更通用的方法来将行从数据表转换为特定的类。

由于我没有使用泛型类型的经验,我发现很难知道如何搜索我想要的内容,但我会尝试解释。

我创建了这个类:

public class Class1
{
    public Guid? Id{ get; set; }
    public string Text1{ get; set; }
    public string Text2{ get; set; }
    public int TheNumber{ get; set; }
}

然后我从表示Class1的数据库中获取数据。我以DataTable的形式返回结果。数据行列中的名称与我的类完全相同,所以我可以在我的泛型方法中以某种方式使用它们来创建Class1的实例。

此时我创建了这样的实例:

public static Class1 AssembleClass1(DataTable dtInfo)
    {
        Class1 obj = null;

        if (dtInfo != null)
        {
            DataRow dr = dtInfo.Rows[0];
            obj = new StrategicObjectives();
            obj.Id= (Guid)dr["Id"];
            obj.Text1 = dr["Id"].ToString();
            obj.Text2 = dr["Id"].ToString();
            obj.TheNumber = (int)dr["TheNumber"];
        }

        return obj;
    }

现在,我想要做的是创建一个采用dataTable和Class1类型的泛型方法(因为我在项目中有很多其他类,我希望能够做同样的事情)。 然后,它应该创建Class1类型的列表并迭代Class1的参数,在数据表的行中找到相应的数据列,并将正确的数据行值分配给Class1的正确参数。 我想它还需要检查Class1的每个参数的类型,以正确转换datarow列类型。

我自己只有这么远,但我不知道它是否正确,我不知道如何继续......:

public static List<T> AssembleItem<T>(DataTable dtItems)
    {
        List<T> items = null;

        if (dtItems != null)
        {
            items = new List<T>();

            foreach (DataRow dr in dtItems.Rows)
            {
                object item = (T)Activator.CreateInstance(typeof(T));
            }
        }

        return items;
    }

我希望有人可以帮助我,请问我是否需要更多信息。

2 个答案:

答案 0 :(得分:2)

为了部分回答这个问题,没有必要使用反射来实现一种类型;您可以使用类型约束来要求无参数构造函数,如下所示。

public static List<T> AssembleItem<T>(DataTable dtItems) where T : new()
{
    List<T> items = null;
    if (dtItems != null)
    {
        items = new List<T>();
        foreach (DataRow dr in dtItems.Rows)
        {
            T item = new T();
            // populate item from dr
            items.Add(item);
        }
    }
    return items;
}

答案 1 :(得分:1)

您可以使用反射来获取类的属性名称并填充它们。

public static List<T> AssembleItem<T>(DataTable dtItems) where T : new()
{
    List<T> items = null;
    if (dtItems != null)
    {
        items = new List<T>();
        foreach (DataRow dr in dtItems.Rows)
        {
            T item = new T();
            foreach (DataRow dr in dtItems.Rows)
            {
                T item = new T();

                Type t = typeof (T);
                foreach (var property in t.GetProperties(BindingFlags.Public))
                {
                    var propertyname = property.Name;

                    //var data = ...get data from row in database with same column name as   propertyname

                    property.SetValue(item,data);
                }
                // populate item from dr
                items.Add(item);
            }
        }
        return items;
    }
}
相关问题