通过包装器

时间:2015-11-03 13:22:57

标签: c# attributes metadata wrapper marker-interfaces

我想看看是否有办法让包装器类在运行时将属性附加到自身,或者从包装类继承某些元数据的任何其他方式。

我希望这不会太久,但这就是我所拥有的:

首先,有一个类代表要发送到设备的命令:

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 个答案:

答案 0 :(得分:1)

而不是使用标记接口(IPriorityCommand)在I-IDeviceCommand中声明属性,例如IsHighPriority

由于命令的优先级是在编译时定义的(通过实现IPriorityCommand),因此您也可以在SomeCommand和SomeOtherCommand中使IsHighPriority属性实现返回true或false

然后最后在SomeCommandWrapper中,将IsHighPriority属性实现为:

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