2017-01-31 14 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. 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() 

現在のアセンブリとそれを参照するすべてのアセンブリでこれを実行します。

関連する問題