编辑:将错误的术语拳击更改为施法。
我有以下问题:
如果我创建一个类型为Action或Func的新Delegate,它将被转换为一种Delegate类型。
var @delegate = Delegate.CreateDelegate(type, @object, methodInfo);
但我需要一个通用类是正确的铸造对象。
请考虑以下示例:
class Example<T> {
Type GenericType() {
return typeof(T);
}
}
static Example<T> Create<T>(T @delegate) {
return new Example<T>();
}
Example.Create(@delegate).GenericType();
这将返回Delegate作为类型,因为这是转换对象的类型(@delegate)。
一种解决方案可能是像这样投射代表:
if(@delegate is Action)
Example.Create((Action)@delegate).GenericType();
但是由于Delegate.CreateDelegate也可以创建Action或Func委托,因此无法检查所有变体。
我无法更改泛型类,所以我必须转换委托。
我希望我能够解释我的问题。我不是母语为英语的人......
编辑:问题是typeof(T)不返回对象的“真实”类型。但我担心没有解决方案。
答案 0 :(得分:0)
@delegate.GetType()
获取代理的实际类型有什么问题?
另外,旁注:你滥用了“拳击”一词。
答案 1 :(得分:0)
如果您可以使用.net 4.0,那么如果您使用动态
,则上述工作正常 Example.Create((dynamic)@delegate).GenericType();
如果你不能,那么你只需做一点反思和抽象。
abstract class Example{
abstract Type GenericType();
}
class Example<T>:Example {
override Type GenericType() {
return typeof(T);
}
}
static Example Create(Delegate @delegate) {
return (Example)Activator.CreateInstance(typeof(Example<>).MakeGenericType(new []{@delegate.GetType()}));
}
答案 2 :(得分:0)
回答我自己的问题:这是不可能的。 :(