框架似乎不允许这样做。
也许我们可以讨论一下你为什么需要知道这些信息?transactionscopeoptions为您提供了一些何时创建事务的灵活性。
但是,拒绝回答“不”,稍后浏览一些源代码,我已经创建了这段代码,它确实有效。请注意,此代码可能会在任何时候停止运行,并对框架进行修补!!!!!
static bool IsEnlisted(SqlConnection sqlConnection)
{
object innerConnection = typeof(SqlConnection).GetField("_innerConnection", BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.FlattenHierarchy).GetValue(sqlConnection);
var enlistedTransactionField =
EnumerateInheritanceChain(innerConnection.GetType())
.Select(t => t.GetField("_enlistedTransaction", BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.FlattenHierarchy))
.Where(fi => fi != null)
.First();
object enlistedTransaction = enlistedTransactionField.GetValue(innerConnection);
return enlistedTransaction != null;
}
static IEnumerable<Type> EnumerateInheritanceChain(Type root)
{
for (Type current = root; current != null; current = current.BaseType)
yield return current;
}
同样,这是在.NET框架中使用私有变量和内部类。虽然今天有效,但明天可能不行。