1

我基本上想要做的是有一个名为GetHandler<T>返回的方法Action<T>。C# 语法允许这样做,但老实说,我不知道你应该如何实现这样的方法。

我想根据 T 的类型返回一个不同的函数,所以我当前的尝试如下所示:

    public override Action<T> GetHandler<T>()
    {
        if (typeof(T) == typeof(MyType))
        {
            return delegate (T t)
            {
                var msg = (MyType)t;
                //do stuff
            }
        }
        return null;
    }

这不起作用,因为它无法转换TMyType. 我也不能返回delegate (MyType msg),因为它当然与签名不匹配。

在这种情况下,理想的情况是,如果 C# 允许对泛型方法进行多次覆盖,您可以在其中为单独的输入指定单独的处理程序,然后使用一个包罗万象的覆盖来处理其他所有事情。我仍然不知道如何实现全部捕获。

那么你建议我做些什么来尽可能接近这个功能呢?在我看来,我的函数几乎什么都做不了,因为 T 不能转换为任何有用的东西。

这是此机制的示例使用:

我们有一个类,它具有实现上述行为的实例集合。这个类有一个方法SendMessage<T>。该方法认为所有包含的实例并GetHandler<T>()在它们上调用,检查结果是否为空,如果不是,则向处理程序发送消息。

4

3 回答 3

3

不确定您需要什么,因为没有给出太多的上下文。但是你可以摆脱困境:

        return delegate (T t)
        {
            var msg = (MyType)(object)t;
            //do stuff
        }

双重强制关闭编译器。这通常是要避免的。

于 2013-09-24T22:49:32.913 回答
1

不确定这是否会有所帮助,但您是否考虑过仅限制泛型?

public override Action<T> GetHandler<T>()
    where T : SomeType // Constrain to some type/interface
{
    // You can treat T like SomeType here
}

这样,您至少可以将 T 视为SomeType-也许这就是您所追求的?如果不能,您能否举一个用法示例,以便我更好地理解您要达到的目标?

于 2013-09-24T22:46:15.690 回答
1

你为什么不做类似的事情:

private void HelloMessageHandler(      HelloMessage      msg ) { ... }
private void GoodByeMessageHandler(    GoodByeMessage    msg ) { ... }
private void HowYaDoingMessageHandler( HowYaDoingMessage msg ) { ... }
.
.
.
public Action<T> GetHandler<T>()
{
  Type t = typeof(T) ;
  Delegate handler ;

  if      ( t == typeof(HelloMessage)      ) handler = (Action<HelloMessage>)      HelloMessageHandler      ;
  else if ( t == typeof(GoodByeMessage)    ) handler = (Action<GoodByeMessage>)    GoodByeMessageHandler    ;
  else if ( t == typeof(HowYaDoingMessage) ) handler = (Action<HowYaDoingMessage>) HowYaDoingMessageHandler ;
  else
  {
    string message =  string.Format( "Unknown Message Type specified: {0}" , t.FullName ) ;
    throw new InvalidOperationException(message);
  }

  Action<T> instance = (Action<T>) handler ;
  return instance ;
}

对我来说似乎很简单。

于 2013-09-24T23:28:43.860 回答