C# 泛型 - 返回一个参数类型依赖的列表。

标签 c# entity-framework generics

完全公开,我并不完全理解泛型,但我希望这个问题的答案能够澄清一切。

我有一个允许用户构建自己的查询的应用程序。该查询将利用 Entity Framework 。我想返回一个结果列表,其类型取决于他们查询的列。换句话说,我需要一个可以有多个返回类型的方法。我在列上使用反射派生类型,然后想传递给这个方法。

    public static T getValues<T>(string ColName, Type type)
    {
        var result = db.AC_PROPERTY.Select(ColName);

        if (type == typeof(string))
        {
            List<string> list = new List<string>();
            //Query and add results to list. 
            return list;

        }

        if (type == typeof(double?) || type == typeof(double))
        {
            List<double> list = new List<double>();
            //Query and add results to list. 
            return list;

        }

        if (type == typeof(int) || type == typeof(int?))
        {
            List<int> list = new List<int>();
            //Query and add results to list. 
            return list;
        }

        if (type == typeof(DateTime))
        {
            List<DateTime> list = new List<DateTime>();
            //Query and add results to list. 
            return list;

        }
    }

我收到一条错误消息,指出我无法将 List(或相应类型)隐式转换为 T。

谁能解释一下,也许可以告诉我如何完成这个。

最佳答案

问问自己:T 怎么样?和 Type type有意义的不同?为什么两者都需要?

你不知道。

此外,虽然在技术上可以检查泛型参数的类型,但您不应该这样做。这是代码的味道。如果您的方法是通用的,那么方法体也应该是通用的。这包括不需要知道 T 的确切值。

<强>1。摆脱 Type type

public static List<T> getValues<T>(string ColName)
{
    //...
}

注意如何使用此方法:

List<DateTime> myDateList = getValues<DateTime>("MyDateTimeColumn");

<强>2。使方法体通用

public static List<T> getValues<T>(string ColName)
{
    List<T> myReturnList = new List<T>();
    var selectedColumnValues = db.AC_PROPERTY.Select(ColName);

    //Query and add results to list. 

    return myReturnList;
}

看起来整洁多了,不是吗?我注意到你省略了列表的实际创建;所以我现在也省略了它。


我可以根据一些假设进入方法体的其余部分,但这里有一个更相关的考虑因素。

你的方法好像和LINQ's Select() method没什么区别| !

所以不要用你定制的 getValues<T> 来做这件事方法:

List<DateTime> myDateList = getValues<DateTime>("MyDateTimeColumn");

您可以使用现有的 LINQ 方法:

List<DateTime> myDateList = myDataList.Select(item => item.MyDateTimeProperty).ToList();

(注意:ToList() 可以是可选的,但由于计算惰性,建议使用。

关于C# 泛型 - 返回一个参数类型依赖的列表。,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50235212/

相关文章:

c# - 寻找通用日志记录接口(interface)以在 NuGet 包中创建通用日志记录

c# - 如何在 C# 控制台应用程序中使用扩展的 ascii 字符

c# - Entity Framework 自动生成的表名

c# - EF Code First - 通过反射为所有实体调用 MapInheritedProperties()

c# - iis工作进程内存使用率与处置对象之间的关系?

vb.net - 如何使 VB.NET 函数的参数作为泛型类型?

C#类型设计问题

c# - ASP.NET 自动生成 aspx.designer.cs 关闭?

c# - 为什么 IEnumerable<T>.Max 不将 T 约束为 IComparable?

generics - Kotlin 注释作为通用函数参数