0

実行時にラッパー クラスに属性をアタッチする方法があるかどうか、またはラップされたクラスから特定のメタデータを継承する他の方法があるかどうかを確認したいと思います。

これが長すぎないことを願っていますが、これは私が持っているものです:

最初に、デバイスに送信されるコマンドを表す特定のクラスがあります。

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ます。

4

1 に答える 1

1

マーカー インターフェイス (IPriorityCommand) を使用する代わりに、IsHighPriority などの I-IDeviceCommand でプロパティを宣言します。

コマンドの優先度はコンパイル時に (IPriorityCommand の実装によって) 定義されるため、IsHighPriority 属性の実装で SomeCommand および SomeOtherCommand で true または false を返すこともできます。

最後に、SomeCommandWrapper で IsHighPriority 属性を次のように実装します。

public bool IsHighPriority { get { return _innerCommand.IsHighPriority; } }
于 2015-11-03T13:49:04.697 に答える