我想创建一种(kinda)流利的接口类,用于配置带有字段的消息。
假设我有一个确认消息和一个允许消息,它们具有完全不同的字段。在流利的配置类中,我要确保字段的长度以及其他配置是一定长度。
例如,我称:
IMessagingSystemConfiguration config = new MessagingSystemConfiguration();
config.AddMessage<Ack>().ValidateLength(x=>x.Body,25);
config.AddMessage<Admit>().ValidateLength(x=>x.Header,10);
MessagingSystemConfiguration类:
public class MessagingSystemConfiguration : IMessagingSystemConfiguration
{
public MessageConfiguration AddMessage<T>() where T: IMessage
{
{
return new MessageConfiguration(T.GetType());
}
}
public class MessageConfiguration
{
private Type _messageType;
public MessageConfiguration(Type messageType)
{
_messageType = messageType;
}
void ValidateLength(Expression<Func<T, object>> field, int length )where T: IField
{
}
}
我只是写了这个,所以忽略了它可能无法编译的事实。我希望ValidateLength中的“ T”为我传递的消息的dataType,以便我可以访问“ Body”和Ack Message,并访问“ Header”作为Admit Message。
我不能使用反射,因为它是我想在编译期间访问的类的属性。
我还可以更改方法:
void ValidateLength<T>(Expression<Func<T, object>> field, int length )where T: IField
{
}
然后致电:
config.AddMessage<Ack>().ValidateLength<Ack>(x=>x.Body,25);
但是我已经知道AddMessage中消息的类型,并且为ValidateLength添加另一个泛型类型增加了额外的复杂性,因为它将始终是我传递给AddMessage的任何类型。
有什么办法吗?
答案 0 :(得分:3)
您也不能使MessageConfiguration
通用吗?
public class MessageConfiguration<T> where T: IField
{
void ValidateLength(Expression<Func<T, object>> field, int length )
{
}
}
然后按如下所示创建它:
public MessageConfiguration<T> AddMessage<T>() where T: IMessage, IField
{
{
return new MessageConfiguration<T>();
}
}