设置没有Setter的C#属性

Sco*_*ott 2 c# reflection

在C#中,有一个Exception类.出于测试目的,我希望能够将其StackTrace属性设置为任意字符串.StackTrace没有setter,所以我的第一次尝试是尝试使用反射:

Exception instance = new Exception("Testing");
PropertyInfo propertyInfo = typeof(Exception).GetProperty("StackTrace");
propertyInfo.SetValue(instance, "Sample StackTrace value", null);
Run Code Online (Sandbox Code Playgroud)

这会产生运行时错误:

System.ArgumentException : Property set method not found.

有什么办法可以设置StackTrace房产吗?更一般地说,有没有办法设置一个缺乏setter的属性?

Mat*_*son 10

您可以派生自己的异常类并覆盖StackTrace属性,该属性是虚拟的:

public sealed class MyException: Exception
{
    public MyException(string message, string stackTrace): base(message)
    {
        _stackTrace = stackTrace;
    }

    public override string StackTrace
    {
        get
        {
            return _stackTrace;
        }
    }

    private readonly string _stackTrace;
}
Run Code Online (Sandbox Code Playgroud)

请注意,要正确执行此操作,您应该真正实现所有标准异常构造函数,但对于单元测试,这可能不是绝对必要的.

有关更多详细信息,请参阅设计自定义例外: