実行時にラッパー クラスに属性をアタッチする方法があるかどうか、またはラップされたクラスから特定のメタデータを継承する他の方法があるかどうかを確認したいと思います。
これが長すぎないことを願っていますが、これは私が持っているものです:
最初に、デバイスに送信されるコマンドを表す特定のクラスがあります。
public interface IDeviceCommand
{
string Name { get; }
byte[] ToByteArray();
}
public class SomeCommand : IDeviceCommand
{ ... }
public class SomeOtherCommand : IDeviceCommand
{ ... }
コマンドはアプリケーションのさまざまな場所からデバイスに送信できますが、一部のコマンドは他のコマンドよりも重要であるためIPriorityCommand
、このコマンドをすぐに送信する必要があることを示すマーカー インターフェイスも定義しました。
// this could also be an attribute btw
public interface IPriorityCommand { }
そして、私のコマンドディスパッチャーはこれをチェックします:
public void SendCommand(IDeviceCommand command)
{
if (command is IPriorityCommand)
SendNow(command);
else
Enqueue(command);
}
また、コマンドの内容を少し変更したり、他の機能を追加したりするために、コマンドをラップする必要がある場合があります。
public SomeCommandWrapper : IDeviceCommand
{
readonly IDeviceCommand _innerCommand;
public CommandWrapper(IDeviceCommand inner)
{ _innerCommand = inner; }
// acts as a proxy, or changes data in a certian way
}
しかし今、私の問題は、ラッパー インスタンスが優先コマンドを実装しなくなったことです。また、私はいくつかのラッパー タイプを持っているので、インターフェイスだけが異なる 2 つのバージョンの各ラッパーを用意するのは意味がありません。
インターフェイスの代わりに属性を使用することもできますが、可能な場合でも、実行時にオブジェクトの属性を設定する方法がわかりません。
もう 1 つの問題は、これらのコマンド ラッパーの一部が一般的であることです。つまり、 について何も知らないアセンブリで定義されていIPriorityCommand
ます。