[英]Passing class metadata through a wrapper
我想看看是否有一種方法可以使包裝器類在運行時將屬性附加到其自身,或者是否有其他任何方法可以從包裝的類繼承某些元數據。
我希望這不會太長,但這就是我所擁有的:
首先,有一個特定的類代表要發送到設備的命令:
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
}
但是現在我的問題是包裝實例不再實現優先級命令。 另外,我有幾種包裝器類型,因此每個包裝器有兩個版本是沒有意義的,只是它們的接口不同。
我也可以使用屬性代替接口,但是我什至不知道如何在運行時設置對象的屬性。
另一個問題是這些命令包裝中的某些包裝是通用的,即在不了解IPriorityCommand
。
在I-IDeviceCommand中聲明一個屬性,例如IsHighPriority,而不是使用標記接口(IPriorityCommand)
由於命令的優先級是在編譯時定義的(通過實現IPriorityCommand),因此您還可以使IsHighPriority屬性實現在SomeCommand和SomeOtherCommand中返回true或false
最后,在SomeCommandWrapper中,將IsHighPriority屬性實現為:
public bool IsHighPriority { get { return _innerCommand.IsHighPriority; } }
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.