Jür*_*ock 2 c# generics subsonic
这是一个关于泛型而不是亚音速的问题:
想象一下,如果有以下代码:
List<int> result =
DB.Select(Product.Columns.Id)
.From<Product>()
.ExecuteTypedList<int>();
Run Code Online (Sandbox Code Playgroud)
这很好用,并返回一个包含我的Product表中的ID的通用列表.
但是,如果我想获得ProductName的列表:
List<String> result =
DB.Select(Product.Columns.ProductName)
.From<Product>()
.ExecuteTypedList<String>();
Run Code Online (Sandbox Code Playgroud)
它会抛出编译器消息(翻译自德语):
"string"必须是非抽象类型,其公共构造函数不带参数,以便用作泛型类型或在泛型方法"SubSonic.SqlQuery.ExecuteTypedList()"中用作参数"T".
cause:String没有空的构造函数:
int i = new int; // works
String s = new String; // compiler error: "string" does not contain a constructor that takes '0' argument
Run Code Online (Sandbox Code Playgroud)
如果我使用它,但是有更优雅的方式,我可以使用List<Object>而不是它有效List<String>吗?
更新:List<Object>不起作用.我确实得到了一个对象列表,但这似乎是"空"对象,不包含我的ProductNames(object.ToString()返回{Object})
通过一点点dotnet魔术,可以在不修补亚音速代码的情况下实现.
创建一个新类SubsonicSqlQueryExtensionMethods并删除此代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using SubSonic;
namespace MyUtil.ExtensionMethods
{
public static class SubSonicSqlQueryExtensionMethods
{
public static List<String> ExecuteTypedList(this SqlQuery qry)
{
List<String> list = new List<String>();
foreach (System.Data.DataRow row in qry.ExecuteDataSet().Tables[0].Rows)
{
list.Add((String)row[0]);
}
return list;
}
}
}
Run Code Online (Sandbox Code Playgroud)现在将MyUtil.ExtensionMethods的引用添加到您的类:
using MyUtil.ExtensionMethods;
Run Code Online (Sandbox Code Playgroud)
最后这个工作:
List<String> result = DB.Select(User.Columns.Name).From<User>().ExecuteTypedList();
Run Code Online (Sandbox Code Playgroud)
请注意,上面的扩展方法重载了没有type-argument的ExecuteTypedList()方法(不幸的是这段代码需要dotnet 3.5,但对我来说它有效)
| 归档时间: |
|
| 查看次数: |
4514 次 |
| 最近记录: |