C# PropertyDescriptor.SetValue异常调用堆栈
我有一些使用PropertyDescriptor设置值的代码。问题是,当它失败时,异常不包含信息或包含引发异常的已执行代码的调用堆栈?在本例中,SetNameInternal()。异常仅包含调用SetValue之前的信息。内部没有例外。有没有办法获取这些信息以便记录下来?(例如,在调试器外部运行应用程序时) 下面的代码演示了这个问题。Exception.ToString()返回的字符串仅包含: 系统。例外:啊! 位于System.ComponentModel.ReflectPropertyDescriptor.SetValue(对象组件,对象值) 在控制台eapp54.Program.Main(字符串[]args)。。。ConsoleApp54.exe已退出,代码为0(0x0) 但问题在于SetNameInternal()。当然,在这个简单的例子中,很明显哪里出了问题,但是现实世界中的情况会有更多的问题,所以调用堆栈是有用的C# PropertyDescriptor.SetValue异常调用堆栈,c#,reflection,propertydescriptor,C#,Reflection,Propertydescriptor,我有一些使用PropertyDescriptor设置值的代码。问题是,当它失败时,异常不包含信息或包含引发异常的已执行代码的调用堆栈?在本例中,SetNameInternal()。异常仅包含调用SetValue之前的信息。内部没有例外。有没有办法获取这些信息以便记录下来?(例如,在调试器外部运行应用程序时) 下面的代码演示了这个问题。Exception.ToString()返回的字符串仅包含: 系统。例外:啊! 位于System.ComponentModel.ReflectPropertyDes
public class Test
{
public string Name
{
get { return m_name; }
set
{
m_name = value;
SetNameInternal();
}
}
void SetNameInternal()
{
throw new Exception("Ah!");
}
private string m_name;
}
class Program
{
static void Main(string[] args)
{
var t = new Test();
try
{
PropertyDescriptorCollection properties = TypeDescriptor.GetProperties(t);
var desc = properties.Find("Name", false);
desc.SetValue(t, "Fail");
//but this would return different StackTrace
//t.Name = "Fail";
}
catch (Exception e)
{
Debug.Write(e.ToString());
}
}
}
@Selvin我在问题中发布了stracktrace。如您所见,它在调用堆栈中不包含SetNameInternal。您是否在发行版或调试版本中测试了它?在发布版本中,编译器可能已经能够优化或内联您的许多方法,因此您将无法获得确切的堆栈跟踪。(顺便说一句:属性不应该抛出异常)。@Selvin
Exception.ToString()
应该调用Environment.StackTrace
@RenéVogt这是一个调试版本。我理解属性不应该抛出异常,我只是想创建一个简单的示例。我编辑了这个问题,以提供更多信息和修改