C# 如何重置只读静态属性?
我通过NuGet在个人项目中使用第三方开源。我遇到的问题是,在C# 如何重置只读静态属性?,c#,.net,static,C#,.net,Static,我通过NuGet在个人项目中使用第三方开源。我遇到的问题是,在上下文类中有一个静态只读属性(默认值),我需要能够修改该属性: public class Context : IContext { private static Context _default; public static Context Default { get { if( _default==null ) _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
调用初始化上下文(例如不同的guid)。
比如:
var myContext = Context.GetDefaultContext();
但不幸的是,GetDefaultContext
被标记为内部,因此我没有公共访问权
我的问题是,如何在不修改源代码的情况下绕过此限制,并且每次使用不同的GUID获得不同的初始化上下文?因为按照现在的方式,我总是在一开始就初始化相同的上下文,使用相同的GUID
下面是..既然您知道私有字段的名称,为什么不将其设置为null并让原始代码自己完成工作呢
Context context = new Context ();
context.GetType().GetField("_default", BindingFlags.Static | BindingFlags.NonPublic).SetValue(null, null);
现在,无论何时再次调用默认属性,它都会再次调用GetDefaultContext
。为什么不自己创建呢?构造函数是公共的。我自己做什么?抱歉,没有获得您可以执行的操作var myContext=new Context()代码>然后设置一些属性。您无法设置Id
,因此它将具有全零GUID。我不知道这是否是个问题。是的,那可能是个问题。我最终使用反射来重置默认字段,正如@TheDutchMan所建议的那样。这是一个非常聪明的想法,需要是BindingFlags.Static
而不是BindingFlags.Instance
我相信。我现在正在测试它,除了它对我有用。谢谢,没问题!我已经更改了绑定标志。我不知道这是一个静电场。