在ServiceStack请求过滤器

时间:2016-04-23 19:04:42

标签: c# generics annotations servicestack action-filter

我有一个请求属性,我正在装饰一些服务,但我需要将泛型类型传递给它,因为它内部发生了一些逻辑。它看起来像这样:

[SomeAttribute(typeof(MyClass))]

这很有效,但是如果我做了像...这样的事情。

[SomeAttribute<MyClass>]

...我会得到“Annotations不能通用”编译时错误。

在我的属性执行逻辑中,我需要执行以下操作:

someClass.doSomething<MyClass>(someString);

所以,我的问题是......

  • 我可以将MyClass投射到某种形式的T,以便我可以这样使用吗?
  • 我是否有另一种方法可以在属性中传递T而不会出现编译错误?

非常感谢!

1 个答案:

答案 0 :(得分:4)

由于错误消息显示.NET Annotations不能是通用的,因此您只能传入后期Type。从后期绑定类型调用泛型方法的唯一方法是使用反射,例如:

var mi = typeof(MyClass).GetMethod("doSomething");
var genericMi = mi.MakeGenericMethod(typeof(MyAttributeType));
var doSomethingFn = (Func<string, object>) genericMi.CreateDelegate(
  typeof(Func<string, object>));

然后,您可以缓存并调用泛型方法的已编译委托,该方法接受string并返回object,例如:

object response = doSomethingFn(someString);