假设我想要继承于 System.Data.SqlClient.SqlTransaction
,但该类是密封的(sealed)。假设我只想在SqlTransaction
上面加一个包装器,并且总是使用MyTransaction
而不是SqlTransaction
。是否有一种方法可以使用隐式/扩大运算符将MyTransaction
潜在地转换为SqlTransaction
?
假设我想要继承于 System.Data.SqlClient.SqlTransaction
,但该类是密封的(sealed)。假设我只想在SqlTransaction
上面加一个包装器,并且总是使用MyTransaction
而不是SqlTransaction
。是否有一种方法可以使用隐式/扩大运算符将MyTransaction
潜在地转换为SqlTransaction
?
public class MyTransaction
{
System.Data.SqlTransaction myTx = someConnection.CreateTransaction();
public void CommitTransaction() : {
myTx.CommitTransaction()
}
}
你也可以让它继承DbTransaction,然后重写抽象和虚拟过程以使用内部的myTx变量,但这样做没有明显的实际原因就会变得有些复杂了...
如果你真的需要隐式转换(尽管我不建议这样做,因为在我看来这是一个可怕的想法和可怕的设计),你可以像这样操作:
class MyTransaction
{
private readonly SqlTransaction _transaction;
public MyTransaction(SqlConnection conn)
{
_transaction = conn.BeginTransaction();
}
public SqlTransaction Transaction
{
get
{
return _transaction;
}
}
public static implicit operator SqlTransaction(MyTransaction t)
{
return t.Transaction;
}
}
好的,排除继承并专注于您真正想解决的任务(基于评论线程)。
过去我曾经成功地通过帮助库运行所有调用并在那里实现逻辑。在过去,我使用了SqlHelper,它发布在Microsoft的数据应用程序块中。这是一个源模块,您可以根据自己的需求进行适应。您可以添加任何所需的日志记录或其他逻辑。
它还使代码非常易读。您可以做像以下这样的事情:
SqlHelper.ExecuteDataset()
用于返回数据集的查询,
SqlHelper.ExecuteScalar()
用于返回单个值的查询,
SqlHelper.ExecuteNonQuery()
用于没有返回值的命令(如INSERT
)。
等等。
不,你不能让你的自定义类继承SqlTransaction或者伪造它。
然而,如果你所做的事情允许你使用DbTransaction,你可以从DbTransaction继承你的自定义事务类,在其中包装一个SqlTransaction并添加任何其他所需功能。
你还有另一种选择,可以使用Reflection.Emit()将你选择的接口添加到SqlTransaction中,然后在你的新MyTransaction类中使用同样的接口,这样你就可以调用接口而不是类。
请注意,这仅适用于你创建的库或使用Reflection特定修改加载的类型。
public static class SqlTransactionExtensions
{
public static void DoSomething(this SqlTransaction transaction, int myParameter)
{
// do something here
}
}
using namespace
,如果它没有在您正在使用的相同命名空间中定义。SqlTransaction t = new SqlTransaction();
t.DoSomething(5);