在 C# 中使用默认泛型值
Using default generic values in C#
我有一些用 C# 编写的代码。我正在尝试编写一些可以重用的通用代码。我的实际代码更复杂。但是,问题代码如下所示:
public async Task<T> ExecuteQueryAsync<T>(string sql)
{
var results = default(T);
using (var database = new SqlConnection("[ConnectionString]"))
{
database.Open();
results = await database.QueryAsync<T>(sql);
}
return results;
}
当我构建我的项目时,我收到一个编译时错误:
Cannot implicitly convert type 'System.Collections.Generic.IEnumerable<T>' to 'T'. An explicit conversion exists (are you missing a cast?)
我不完全明白为什么会出现此错误。我打算这样称呼它:
Adapter adapter = new Adapter();
var results = await adapter.ExecuteQueryAsync<IEnumerable<Customer>>("SELECT * FROM Customer");
在上面,T
不是 IEnumerable<T>
吗?如果是这样的话,我不明白为什么我会在编译时遇到这种类型转换错误。
谢谢!
尝试这样的事情。
public async Task<IEnumerable<T>> ExecuteQueryAsync<T>(string sql)
{
IEnumerable<T> results = Enumerable.Empty<T>();
using (var database = new SqlConnection("[ConnectionString]"))
{
database.Open();
results = await database.QueryAsync<T>(sql);
}
return results;
}
在你的 ExecuteQueryAsync
中你不需要它 results
变量,因为你总是重写它。所以你的函数可以这样
public async Task<IEnumerable<T>> ExecuteQueryAsync<T>(string sql)
{
using (var database = new SqlConnection("[ConnectionString]"))
{
database.Open();
return await database.QueryAsync<T>(sql);
}
}
这里已经有很好的答案,但我想确保我们有一个支持安全查询参数化的答案。原始代码迫使您编写极其不安全的代码,将 导致您的应用程序被黑客入侵。这可以让你避免:
public async Task<IEnumerable<T>> ExecuteQueryAsync<T>(string sql, dynamic Parameters = null)
{
IEnumerable<T> results;
using (var database = new SqlConnection("[ConnectionString]"))
{
database.Open();
results = await database.QueryAsync<T>(sql, Parameters);
}
return results;
}
那么你可以这样称呼它:
Adapter adapter = new Adapter();
var results = await adapter.ExecuteQueryAsync<IEnumerable<Customer>>(
"SELECT * FROM Customer WHERE Sales >= @Sales",
new {Sales = 500.0m});
我有一些用 C# 编写的代码。我正在尝试编写一些可以重用的通用代码。我的实际代码更复杂。但是,问题代码如下所示:
public async Task<T> ExecuteQueryAsync<T>(string sql)
{
var results = default(T);
using (var database = new SqlConnection("[ConnectionString]"))
{
database.Open();
results = await database.QueryAsync<T>(sql);
}
return results;
}
当我构建我的项目时,我收到一个编译时错误:
Cannot implicitly convert type 'System.Collections.Generic.IEnumerable<T>' to 'T'. An explicit conversion exists (are you missing a cast?)
我不完全明白为什么会出现此错误。我打算这样称呼它:
Adapter adapter = new Adapter();
var results = await adapter.ExecuteQueryAsync<IEnumerable<Customer>>("SELECT * FROM Customer");
在上面,T
不是 IEnumerable<T>
吗?如果是这样的话,我不明白为什么我会在编译时遇到这种类型转换错误。
谢谢!
尝试这样的事情。
public async Task<IEnumerable<T>> ExecuteQueryAsync<T>(string sql)
{
IEnumerable<T> results = Enumerable.Empty<T>();
using (var database = new SqlConnection("[ConnectionString]"))
{
database.Open();
results = await database.QueryAsync<T>(sql);
}
return results;
}
在你的 ExecuteQueryAsync
中你不需要它 results
变量,因为你总是重写它。所以你的函数可以这样
public async Task<IEnumerable<T>> ExecuteQueryAsync<T>(string sql)
{
using (var database = new SqlConnection("[ConnectionString]"))
{
database.Open();
return await database.QueryAsync<T>(sql);
}
}
这里已经有很好的答案,但我想确保我们有一个支持安全查询参数化的答案。原始代码迫使您编写极其不安全的代码,将 导致您的应用程序被黑客入侵。这可以让你避免:
public async Task<IEnumerable<T>> ExecuteQueryAsync<T>(string sql, dynamic Parameters = null)
{
IEnumerable<T> results;
using (var database = new SqlConnection("[ConnectionString]"))
{
database.Open();
results = await database.QueryAsync<T>(sql, Parameters);
}
return results;
}
那么你可以这样称呼它:
Adapter adapter = new Adapter();
var results = await adapter.ExecuteQueryAsync<IEnumerable<Customer>>(
"SELECT * FROM Customer WHERE Sales >= @Sales",
new {Sales = 500.0m});