我有一个请求属性,我正在装饰一些服务,但由于其中发生了一些逻辑,我需要将泛型类型传递给它。它看起来像这样:
[SomeAttribute(typeof(MyClass))]
这很好用,但是如果我做一些事情,例如...
[SomeAttribute<MyClass>]
。我会得到一个"注释不能是通用的"编译时错误。
在我的属性执行逻辑中,我需要执行以下操作:
someClass.doSomething<MyClass>(someString);
所以,我的问题是...
- 我可以将
MyClass
转换为某种形式的T
以便以这种方式使用它吗? - 有没有另一种方法可以在属性中传递
T
而不会收到编译错误?
非常感谢!
正如错误消息所说,.NET 注释不能是通用的,因此您只能传入后期绑定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);