Фреймворк не позволяет этого.
Возможно, мы могли бы обсудить, почему вам нужно знать эту информацию? 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. Хотя сегодня это работает, может и не завтра.