Я использую сторонний открытый компонент 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.
Поскольку вы знаете имя частного поля, почему бы не установить его значение null и сделать исходный код самой работой?
Context context = new Context ();
context.GetType().GetField("_default", BindingFlags.Static | BindingFlags.NonPublic).SetValue(null, null);
Теперь, когда вы снова вызываете свойство по умолчанию, он снова вызовет GetDefaultContext
.
BindingFlags.Static
вместоBindingFlags.Instance
я верю. Сейчас проверяю