如何公开具有动态数据类型的通用方法?

时间:2018-08-01 01:53:22

标签: c#

我想创建一种(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的任何类型。

有什么办法吗?

1 个答案:

答案 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>();
  }
}