相关疑难解决方法(0)

在.net Exception中如何获取带有参数值的堆栈跟踪

我试图在.net(c#)中添加一个未处理的异常处理程序,该处理程序对于'user'应该尽可能有用.最终用户大多是程序员,所以他们只需要暗示他们操纵错误的对象.

当应用程序崩溃时,我正在开发类似于Windows XP错误报告的窗口,但是尽可能多地提供关于抛出的异常的中间信息.

虽然堆栈跟踪使我(因为我有源代码)能够查明问题的根源,但是用户没有它,因此它们在没有进一步信息的情况下丢失.不用说我必须花很多时间来支持这个工具.

有一些系统异常,如Dictionary集合抛出的KeyNotFoundException,它真的让我感到烦恼,因为它们没有在消息中包含未找到的密钥.我可以使用大量的try catch块来填充我的代码,但它相当激进并且需要维护更多的代码,更不用说更多的字符串必须最终被本地化.

最后一个问题:有没有办法获得(在运行时)调用堆栈跟踪中每个函数的参数值?仅这一点就可以解决90%的支持电话.

.net c# exception

39
推荐指数
4
解决办法
2万
查看次数

如何获取方法参数的名称?

如果我有一个方法如:

public void MyMethod(int arg1, string arg2)
Run Code Online (Sandbox Code Playgroud)

我如何获得参数的实际名称?我似乎无法在MethodInfo中找到任何实际上会给我参数名称的内容.

我想写一个看起来像这样的方法:

public static string GetParamName(MethodInfo method, int index)
Run Code Online (Sandbox Code Playgroud)

所以如果我用以下方法调用此方法:

string name = GetParamName(MyMethod, 0)
Run Code Online (Sandbox Code Playgroud)

它将返回"arg1".这可能吗?

.net c# reflection

31
推荐指数
2
解决办法
5万
查看次数

如何枚举传递的方法参数

可以枚举被调用的方法参数类型/信息,如下所示:

private void SomeMethod(int thisValue, string thatValue)
{
  StackTrace stackTrace = new StackTrace();
  foreach (ParameterInfo pInfo in stackTrace.GetFrame(0).GetMethod().GetParameters())
  {
    string name = pInfo.Name;
    string type = pInfo.GetType().ToString();
  }
}
Run Code Online (Sandbox Code Playgroud)

但有没有办法得到每个参数的实际对象?

编辑:我的目标是枚举所有参数并获取它们的值.使用LinQ表达式,可以获得如下参数值:

private void SomeMethod(int thisValue, string thatValue)
{
  object valueOfThis = GetParameterValue(() => thisValue);
  object valueOfThat = GetParameterValue(() => thatValue);
}
private object GetParameterValue<T>(Expression<Func<T>> expr)
{
  var body = ((MemberExpression)expr.Body);
  return ((FieldInfo)body.Member).GetValue(((ConstantExpression)body.Expression).Value);
}
Run Code Online (Sandbox Code Playgroud)

但我想做的是:

foreach (fooObject o in thisMethod.GetParameterObjects())
{
  object someValue = GetParameterValue(() => fooObject);
}
Run Code Online (Sandbox Code Playgroud)

因此,有一个通用的方法来收集所有参数及其值.

c# reflection

11
推荐指数
1
解决办法
5241
查看次数

标签 统计

c# ×3

.net ×2

reflection ×2

exception ×1