完全公开,我并不完全理解泛型,但我希望这个问题的答案能够澄清一切。
我有一个允许用户构建自己的查询的应用程序。该查询将利用 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/