2015-11-03 19 views
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 
} 

但現在我的問題是包裝器實例不再實現優先級命令。另外,我有幾個包裝類型,所以每個包裝的兩個版本沒有意義,只有它們的接口不同。

我也可以使用屬性而不是接口,但我不知道如何在運行時設置對象的屬性,如果它甚至是可能的。

另外一個問題是,這些命令包裝中的一些是通用的,即在不知道任何關於IPriorityCommand的程序集中定義。

回答

1

代替使用一個標記接口(IPriorityCommand)的聲明在I-IDeviceCommand屬性如IsHighPriority

由於命令的優先級是在編譯時定義(通過實施IPriorityCommand)也可以有IsHighPriority屬性實施返回在SomeCommand真或假,並在SomeCommandWrapper SomeOtherCommand

於是最後,實現IsHighPriority屬性爲:

public bool IsHighPriority { get { return _innerCommand.IsHighPriority; } } 
+0

+1謝謝,一個問題可能是'IDeviceCommand'是在一個單獨的程序集中實現的,我的程序集引用它並擴展了調度程序。 – Lou

+0

但派生的調度員仍然可以訪問優先級,因爲它是公共的?我錯了什麼? –

+0

所以你沒有IDeviceCommand的源代碼? –