Как сбросить статическое свойство только для чтения?

1

Я использую сторонний открытый компонент Object Comparer для использования в личном проекте через NuGet. Проблема заключается в том, что в классе 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;

Проблема в том, что мне нужно инициализировать Context (например, разные GUIDS) для каждого вызова Compare. Что-то вроде:

var myContext = Context.GetDefaultContext();

Но, к сожалению, GetDefaultContext помечен как внутренний, поэтому у меня нет открытого доступа к нему.

Мой вопрос в том, как я могу обойти это ограничение без изменения исходного кода и каждый раз получать разный инициализированный Context с другим GUID? Потому что так, как сейчас, я всегда получаю тот же контекст, инициализированный в начале, с тем же GUID.

Вот исходный код для контекста..

Теги:
static

1 ответ

1
Лучший ответ

Поскольку вы знаете имя частного поля, почему бы не установить его значение null и сделать исходный код самой работой?

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

Теперь, когда вы снова вызываете свойство по умолчанию, он снова вызовет GetDefaultContext.

  • 0
    Умная идея, должен быть BindingFlags.Static вместо BindingFlags.Instance я верю. Сейчас проверяю
  • 0
    Кроме этого исправления BindingFlags это работало для меня. Спасибо
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню