如何重置只读静态属性
本文关键字:属性 静态 只读 何重置 | 更新日期: 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