- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我更喜欢使用很多扩展方法,如ToFloat
, ToInt
, ToLoong
, ToGuid
, ToSqlParameter
现在,自从我一直在我现在的位置工作以来,有些人一直在提示他们在日常对象上看到的大量扩展方法。
对于我的问题,我将起诉示例:“ToSqlParameter”
public static SqlParameter ToSqlParameter(this object source, string name, bool structured = false)
{
var para = new SqlParameter { ParameterName = name, Value = source };
if (structured) { para.SqlDbType = SqlDbType.Structured; }
return para;
}
where T : class
的内容只会让它在类上工作,但因为这个方法应该能够在
string
上使用,
bool
, 甚至
objects
我对此无能为力。
List<SqlParameter>
时使用
var str = "Some Strnig";
var list = new List<SqlParameter>();
var list2 = new List<string>();
list.Add(str.ToSqlParameter("@str")); //Should work
list2.Add(str.ToSqlParameter("@str")); //Should return 'SqlParameter not found'
最佳答案
不,这是不可能的。
扩展方法仅因您尝试调用它们的类型而被发现,而不是基于周围的上下文。
您的最后一行代码会得到一个不同的错误,因为 ToSqlParameter
的结果无法添加到列表中,但该方法可用。
“过滤”扩展方法的唯一方法是:
object
using X;
的位置指令使其可用。 public static void AddParameters(this SqlCommand command, object parameters)
{
foreach (var propertyInfo in parameters.GetType().GetProperties())
{
object propertyValue = propertyInfo.GetValue(parameters, null);
command.Parameters.AddWithValue("@" + propertyInfo.Name, propertyValue);
}
}
public void DeletePersonById(int id)
{
var cmd = new SqlCommand();
cmd.Connection = ...
cmd.CommandText = "delete from persons where person_id = @id");
cmd.AddParameters(new { id });
cmd.ExecuteNonQuery();
...
SqlParameter
对象,您可能希望扩展它以更好地处理特殊类型,例如具有大小的字符串等。
using (var conn = new SqlConnection("...").AutoOpen())
{
// prepare a fresh new database
conn.Execute("if exists (select * from sysdatabases where name = 'SO16962113') drop database SO16962113");
conn.Execute("create database SO16962113");
conn.Execute("use SO16962113");
// execute some queries
conn.Execute("create table persons (person_id int primary key not null identity(1,1), person_name varchar(100))");
conn.Execute("insert into persons (person_name) values ('James'), ('Jon'), ('Mary'), ('Jack')");
conn.Query<Person>("select * from persons where person_id in (@id1, @id2)", new { id1 = 2, id2 = 4 }).Dump();
// clean up
conn.Execute("use master");
conn.Execute("drop database SO16962113");
}
关于c# - ExtensionMethod 特定于类、属性或方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16962113/
我更喜欢使用很多扩展方法,如ToFloat , ToInt , ToLoong , ToGuid , ToSqlParameter 现在,自从我一直在我现在的位置工作以来,有些人一直在提示他们在日常对
我只是在行中写了一个 if 语句 if (value == value1 || value == value2 || value == value3 || value == value4) /
我正在实现一个自定义本地化系统,我在其中使用属性属性来存储本地化文本。 我需要做的是使用 DisplayName 属性中包含的文本设置一个 Textblock 的 Text。 例如我有这个属性: [D
我想为 ConvertAll 编写我的扩展方法List 中的方法.我在下面这样写。 public static List MyConvertAll(this List list, Converter
我是一名优秀的程序员,十分优秀!