C# 从字符串C中检索对象#
我有下面的MapperJSON文件,它告诉我对于给定的异常,我要使用哪个错误处理策略C# 从字符串C中检索对象#,c#,reflection,polly,C#,Reflection,Polly,我有下面的MapperJSON文件,它告诉我对于给定的异常,我要使用哪个错误处理策略 { "ExceptionMappers": [ { "ExceptionName": "TimeoutException", "ExceptionType": "Transient", "Policy": "WaitAndRetry", "WaitType": "Linear" }, { "ExceptionName": "DivideByZeroException",
{
"ExceptionMappers": [
{
"ExceptionName": "TimeoutException",
"ExceptionType": "Transient",
"Policy": "WaitAndRetry",
"WaitType": "Linear"
},
{
"ExceptionName": "DivideByZeroException",
"ExceptionType": "Permanent",
"Policy": "CircuitBreaker"
},
{
"ExceptionName": "StackOverflowException",
"ExceptionType": "LogOnly",
"Policy": "WaitAndRetry",
"WaitType": "Linear"
}
]
}
然后使用下面的代码,我试图获取异常的类型,并应用一个可以调用操作的策略。但是在这里,我陷入了困境,如何从字符串名称中获取异常类型
public void Execute(Action action, string exceptionName)
{
var filePath = @"appsetting.json";
var exceptionMapperJson = System.IO.File.ReadAllText(filePath);
var rootNode = JsonConvert.DeserializeObject<RootObject>(exceptionMapperJson);
var exceptionNode = rootNode.ExceptionMappers.FirstOrDefault(e => e.ExceptionName.Equals(exceptionName));
var exceptionObject = Type.GetType(exceptionName);
if (exceptionNode != null)
{
// Here I need the exception from the string value
Policy.Handle<TimeoutException>().Retry().Execute(action);
}
else
{
// No Policy applied
Policy.NoOp().Execute(action);
}
}
public void Execute(操作,字符串异常名称)
{
var filePath=@“appsetting.json”;
var exceptionMapperJson=System.IO.File.ReadAllText(文件路径);
var rootNode=JsonConvert.DeserializeObject(ApperJSON除外);
var exceptionNode=rootNode.ExceptionMappers.FirstOrDefault(e=>e.ExceptionName.Equals(ExceptionName));
var exceptionObject=Type.GetType(exceptionName);
if(exceptionNode!=null)
{
//这里我需要字符串值中的异常
Policy.Handle().Retry().Execute(操作);
}
其他的
{
//没有适用的政策
Policy.NoOp().Execute(action);
}
}
根据@thehenny的评论,介绍了当泛型类型仅在运行时已知时,如何使用反射来调用泛型方法。与链接答案略有不同:因为.Handle()
是策略上的静态方法,所以将null
作为第一个参数传递给MethodInfo.Invoke()
或者,因为,您可以简单地:
var exceptionType = Type.GetType(exceptionName);
if (exceptionNode != null)
{
Policy.Handle<Exception>(e => exceptionType.IsAssignableFrom(e.GetType())) // etc
}
var exceptionType=Type.GetType(exceptionName);
if(exceptionNode!=null)
{
Policy.Handle(e=>exceptionType.IsAssignableFrom(e.GetType())//等
}
这表明它是有效的
或者,使包装器方法本身具有通用性:
public void Execute<TException>(Action action) where TExecption : Exception
{
// reverses the approach:
// you'll want a typeof(TException).Name, to get the string name of the exception from TException
// Then you can just Policy.Handle<TException>(...) when you construct the policy
}
public void Execute(Action-Action),其中texecoption:Exception
{
//与方法相反:
//您需要一个typeof(TException).Name,从TException获取异常的字符串名称
//然后,在构造策略时,可以只使用Policy.Handle(…)
}
作为另一个细化,您可以考虑在启动时只构造一次策略,并将其放置在
可能的副本中。