Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/276.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# PropertyDescriptor.SetValue异常调用堆栈_C#_Reflection_Propertydescriptor - Fatal编程技术网

C# PropertyDescriptor.SetValue异常调用堆栈

C# PropertyDescriptor.SetValue异常调用堆栈,c#,reflection,propertydescriptor,C#,Reflection,Propertydescriptor,我有一些使用PropertyDescriptor设置值的代码。问题是,当它失败时,异常不包含信息或包含引发异常的已执行代码的调用堆栈?在本例中,SetNameInternal()。异常仅包含调用SetValue之前的信息。内部没有例外。有没有办法获取这些信息以便记录下来?(例如,在调试器外部运行应用程序时) 下面的代码演示了这个问题。Exception.ToString()返回的字符串仅包含: 系统。例外:啊! 位于System.ComponentModel.ReflectPropertyDes

我有一些使用PropertyDescriptor设置值的代码。问题是,当它失败时,异常不包含信息或包含引发异常的已执行代码的调用堆栈?在本例中,SetNameInternal()。异常仅包含调用SetValue之前的信息。内部没有例外。有没有办法获取这些信息以便记录下来?(例如,在调试器外部运行应用程序时)

下面的代码演示了这个问题。Exception.ToString()返回的字符串仅包含:

系统。例外:啊! 位于System.ComponentModel.ReflectPropertyDescriptor.SetValue(对象组件,对象值) 在控制台eapp54.Program.Main(字符串[]args)。。。ConsoleApp54.exe已退出,代码为0(0x0)

但问题在于SetNameInternal()。当然,在这个简单的例子中,很明显哪里出了问题,但是现实世界中的情况会有更多的问题,所以调用堆栈是有用的

    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这是一个调试版本。我理解属性不应该抛出异常,我只是想创建一个简单的示例。我编辑了这个问题,以提供更多信息和修改