私の質問に答えて議論するために時間を割いてくれたすべての人に感謝します.
お知らせするために、私のニーズに十分なソリューションを実装しました。解決策は一般的ではなく、いくつかの落とし穴がありますが、他の人の助けになる場合に備えて、とにかく共有すると思いました.
原則として、フィールドを定義するときに使用されるクラスは次のようになります。
public class Unit : IUnit {
public NameOfField { get; set; }
...
}
ご覧のとおり、このクラスは IUnit インターフェイスを実装しており、NameOfField プロパティにパブリック セッターを提供しています。
静的フィールドは通常、いくつかの包含クラス内で次のように定義されます。
public static Unit Hectare = new Unit();
私の解決策は、フィールドが実装で使用される前に、リフレクションを通じて NameOfField プロパティを設定することです。これは、静的コンストラクターを介して行います (もちろん、Unit フィールドにアクセスする前に呼び出す必要があります。Linq を使用して、関連するフィールドの実行中のアセンブリをトラバースし、これらのフィールド (型が IUnit インターフェイスを実装するフィールド) を検出した場合) )、Any 拡張メソッドを使用して、それぞれに NameOfField プロパティを設定します。
Assembly.GetExecutingAssembly().GetTypes().
SelectMany(type => type.GetFields(BindingFlags.Public | BindingFlags.Static)).
Where(fieldInfo => fieldInfo.FieldType.GetInterfaces().Contains(typeof(IUnit))).
Any(fieldInfo =>
{
((IUnit)fieldInfo.GetValue(null)).NameOfField= fieldInfo.Name;
return false;
});
このアプローチにはいくつかの欠点があります。
- Unit フィールドにアクセスする前に、静的コンストラクターを手動で呼び出す必要があります。
- NameOfField セッターはパブリックです。私の場合は問題ありませんが、他のシナリオで適用する場合は問題になる可能性があります。(セッターを非公開にして、さらに検討することで呼び出すことができると思いますが、その道をさらに探求する時間は取っていません。)
- ... ?
いずれにせよ、この解決策は私以外の誰かに役立つかもしれません.