如何重置只读静态属性

本文关键字:属性 静态 只读 何重置 | 更新日期: 2023-09-27 18:04:39

我通过NuGet在个人项目中使用第三方开源对象比较器util。我的问题是,在Context类有一个静态只读属性(Default),我需要能够修改:

    public class Context :
    IContext
{
    private static Context _default;
    public static Context Default {
        get {
            if( _default==null )
                _default = GetDefaultContext();
            return _default;
        }
    }
    private Guid _id;
    public Guid Id { get { return _id; } }

    internal static Context GetDefaultContext() {
        //....Initializing the context here, e.g. assign a GUID
        var ctx = new Context();
        _id = GetGuid();
    }

在我的Compare方法中我这样调用它:

var myContext = Context.Default;

问题是我需要为每个Compare调用初始化Context(例如不同的GUIDS)。比如:

var myContext = Context.GetDefaultContext();

但不幸的是GetDefaultContext被标记为内部,所以我没有公开访问它。

我的问题是如何在不修改源代码的情况下绕过这个限制,并且每次使用不同的GUID获得不同的初始化Context ?因为现在我总是用相同的GUID初始化相同的Context

如何重置只读静态属性

既然您知道私有字段的名称,为什么不将其设置为null并使原始代码本身完成工作?

Context context = new Context ();
context.GetType().GetField("_default", BindingFlags.Static | BindingFlags.NonPublic).SetValue(null, null);

现在当你再次调用默认属性时,它将再次调用GetDefaultContext