Этот синтаксис не будет работать в C #.Вместо этого рассмотрим следующий «обходной путь».
try
{
throw new FaultException<DerivedClass2>(new DerivedClass2());
}
catch (FaultException fex)
{
bool handled = false;
Type fexType = fex.GetType();
if (fexType.IsGenericType && fexType.GetGenericTypeDefinition() == typeof(FaultException<>))
{
if (typeof(BaseClass1).IsAssignableFrom(fexType.GetGenericArguments()[0]))
{
object detail = fexType.GetProperty("Detail").GetValue(fex, null);
// Use detail here.
handled = true;
}
}
if (!handled)
throw; // Don't know how to handle. Re-throw.
}
Это можно упростить, если не учитывать необычный случай, когда Detail == null
, но сконструированный универсальный тип совпадает.Я также буду использовать динамическое ключевое слово C #, чтобы немного упростить его.
try
{
throw new FaultException<DerivedClass2>(new DerivedClass2());
}
catch (FaultException fex)
{
bool handled = false;
Type fexType = fex.GetType();
if (fexType.IsGenericType && fexType.GetGenericTypeDefinition() == typeof(FaultException<>))
{
object detail = ((dynamic)fex).Detail;
if (detail is BaseClass1) // true for subclasses too!
{
// Use detail here.
}
}
if (!handled)
throw; // Don't know how to handle. Re-throw.
}
Еще одна вещь, которую стоит рассмотреть, стоит ли просто использовать throw new FaultException<BaseClass1>(new DerivedClass2())
.Этот способ броска позволит вам ловить, используя код, который вы изначально предоставили.