2014-05-21 5 views
1

NuGet을 통한 개인 프로젝트에서 타사 오픈 소스 Object Comparer util을 사용하고 있습니다.읽기 전용 정적 속성을 재설정하는 방법은 무엇입니까?

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 방법은 내가 같이 호출 :

내가 가진 문제는 Context 클래스에서 내가 수정할 수 있어야 정적 읽기 전용 속성 ( Default)을가한다는 것이다
var myContext = Context.Default; 

문제는 모든 Compare 호출에 대해 Context (예 : 다른 GUIDS)을 초기화해야한다는 것입니다. 같은 뭔가 :

var myContext = Context.GetDefaultContext(); 

그러나 불행하게도 GetDefaultContext가 내부로 표시됩니다 그래서 그것을에 공용 액세스 할 수 없습니다.

제 질문은 소스 코드를 수정하지 않고이 제한 사항을 해결하고 다른 GUID를 사용하여 매번 Context 초기화를 초기화 할 수 있습니까? 왜냐하면 지금은 항상 동일한 컨텍스트가 처음부터 동일한 GUID로 초기화됩니다. 여기

는 왜 작업 자체를 원래의 코드를 수행 null에 확인하도록 설정

+1

왜 직접 만들지 않습니까? 생성자는 public입니다. –

+0

나 자신을 확인 하시겠습니까? 죄송합니다. 아이디어를 얻지 못했습니다. –

+0

'var myContext = new Context();'하고 몇 가지 속성을 설정할 수 있습니다. 'Id'를 설정할 수 없으므로 GUID는 모두 0입니다. 이것이 문제인지 나는 모른다. –

답변

1

당신은 전용 필드의 이름을 알고 있기 때문에 있습니다 .. Source Code for Context입니까?

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

이제 기본 속성을 다시 호출 할 때마다 GetDefaultContext이 다시 호출됩니다.

+0

영리한 아이디어는'BindingFlags.Instance' 대신'BindingFlags.Static'이되어야한다고 생각합니다. 지금 테스트 중입니다. –

+0

BindingFlags 수정 이외에이 작업이 저에게 효과적이었습니다. 감사합니다 –

+2

괜찮습니다! BindingFlags를 변경했습니다. 나는 이것이 정적 장임을 인식하지 못했습니다. –

관련 문제