Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.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# 如何重置只读静态属性?_C#_.net_Static - Fatal编程技术网

C# 如何重置只读静态属性?

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

我通过NuGet在个人项目中使用第三方开源。我遇到的问题是,在
上下文
类中有一个静态只读属性(
默认值
),我需要能够修改该属性:

    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
我相信。我现在正在测试它,除了它对我有用。谢谢,没问题!我已经更改了绑定标志。我不知道这是一个静电场。