通过包装器传递 class 元数据
Passing class metadata through a wrapper
我想看看是否有办法让包装器 class 在运行时将属性附加到自身,或任何其他方式从包装器 class 继承某些元数据。
我希望这不会太长,但这是我所拥有的:
首先有一个class表示要发送到设备的命令:
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
.
一无所知的程序集中定义
不使用标记接口 (IPriorityCommand),而是在 I-IDeviceCommand 中声明 属性,例如 IsHighPriority
由于命令的优先级是在编译时定义的(通过实现 IPriorityCommand),您还可以让 IsHighPriority 属性实现在 SomeCommand 和 SomeOtherCommand 中返回 true 或 false
最后在 SomeCommandWrapper 中,将 IsHighPriority 属性实现为:
public bool IsHighPriority { get { return _innerCommand.IsHighPriority; } }
我想看看是否有办法让包装器 class 在运行时将属性附加到自身,或任何其他方式从包装器 class 继承某些元数据。
我希望这不会太长,但这是我所拥有的:
首先有一个class表示要发送到设备的命令:
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
.
不使用标记接口 (IPriorityCommand),而是在 I-IDeviceCommand 中声明 属性,例如 IsHighPriority
由于命令的优先级是在编译时定义的(通过实现 IPriorityCommand),您还可以让 IsHighPriority 属性实现在 SomeCommand 和 SomeOtherCommand 中返回 true 或 false
最后在 SomeCommandWrapper 中,将 IsHighPriority 属性实现为:
public bool IsHighPriority { get { return _innerCommand.IsHighPriority; } }