2010-02-24 10 views
19

나는 static classstatic private readonly 회원을 가지고 있는데, 이는 클래스 static constructor을 통해 설정됩니다. 아래는 간단한 예입니다. 상기 클래스는 정적 클래스이므로리플렉션을 사용하여 정적 클래스의 정적 정적 멤버를 설정할 수 있습니까?

public static class MyClass 
{ 
    private static readonly string m_myField; 

    static MyClass() 
    { 
     // logic to determine and set m_myField; 
    } 

    public static string MyField 
    { 
     get 
     { 
      // More logic to validate m_myField and then return it. 
     } 
    } 
} 

, I는 검색 할 FieldInfo.GetValue() 통화로 그러한 패스를 이용하기 위해 그것의 인스턴스를 생성하고 나중에 m_myField의 값을 설정할 수 없다. FieldInfo 클래스를 사용하여 정적 클래스에 값을 설정하거나 유일한 옵션은 단위 테스트를 요청한 클래스를 리팩토링하는 것입니다.

using System; 
using System.Reflection; 

class Example 
{ 
    static void Main() 
    { 
     var field = typeof(Foo).GetField("bar", 
          BindingFlags.Static | 
          BindingFlags.NonPublic); 

     // Normally the first argument to "SetValue" is the instance 
     // of the type but since we are mutating a static field we pass "null" 
     field.SetValue(null, "baz"); 
    } 
} 

static class Foo 
{ 
    static readonly String bar = "bar"; 
} 
+3

왜 것 : 여기 – flq

+0

+1 그리고 그 타입이 그런 타입이라면 그 타입이 Get/SetValue 클래스의 인스턴스가 될 필요는 없습니다. 감사합니다 – JamesEggers

답변

32

그것을 수행하는 방법을 보여주는 간단한 예입니다 인스턴스가 리플렉션 정보를 얻길 원하십니까? 단지 typeof (MyClass)라고 말하면서 리플렉션 API의 재미있는 비트로 들어간다.
+0

이것은 "개인"액세스 제어 위반입니까? – athos

+10

일반적으로 언제든지 반성을 사용하면 어떤 법칙을 위반하는 것입니다. – SamuelWarren

0

이 "널 규칙"또한 정적 필드 FieldInfo.GetValue()에 적용, 예를 들어,

Console.Writeline((string)(field.GetValue(null))); 
+0

참고 - 원래 답변에 대한 댓글 이었음에 틀림 없습니다. 이것은 답변으로 게시되었으며 정적 멤버에 값을 설정하는 방법 인 원래 질문에 직접 응답하지 않습니다. 이것은 좋은 정보를 공유하는 것입니다, 그것은 방금 OP에 원래 문제를 해결하는 방법을 설명하는 해답에 대한 의견으로되어 있어야합니다 –

관련 문제