2017-01-31 8 views
1

필드를 속성으로 바꾸려면 Cecil을 사용할 수 있습니까? 구체적으로 :Mono.Cecil은 필드를 속성으로 바꿀 수 있습니까?

// Replace this. 
public static readonly Something Thing = new Something(...); 

// With this. 
private static readonly Something _Thing = new Something(...); 

public static Something Thing 
{ 
    get 
    { 
     // My goal is to insert some extra code here, which I can't do if it's a field. 
     return _Thing; 
    } 
} 

그리고 가능한 경우 효율적으로 수행 할 수 있습니까? I.E. 그런 다음 모든 참조 어셈블리의 모든 유형에서 모든 메서드를 통해 Thing의 모든 인스턴스를 해당 속성의 get_Thing으로 호출해야합니다.

사용자가 public static Something Thing { get; } = new Something(...);으로 작성하여 이미 속성이므로 쓰기가 훨씬 쉽습니다. Unity의 컴파일러가 속성 초기화 프로그램을 지원하지 않기 때문에 그렇게 할 수 없습니다.

참고 : IL을 사용한 작업에 대해서는 알지 못합니다.

답변

1

예, 당신은 쉽게 필드를 제거하고 같은 이름의 속성을 추가,하지만 당신의 API 표면을 변경할 수 있습니다 당신이

에 의해 모든

IL_XXXX: ldsfld class [MyAssembly]Something [MyAssembly]MyClass::Thing 

을 찾기 위해해야 ​​할 세실를 사용하여

IL_XXXX: call class [MyAssembly]Something class [MyAssembly]MyClass::get_Thing() 

현재 어셈블리와이 어셈블리를 참조하는 모든 어셈블리에서이를 수행합니다.