C#在运行时动态地转换通用对象

时间:2011-03-05 22:28:43

标签: c# generics reflection delegates

编辑:将错误的术语拳击更改为施法。

我有以下问题:

如果我创建一个类型为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)不返回对象的“真实”类型。但我担心没有解决方案。

3 个答案:

答案 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)

回答我自己的问题:这是不可能的。 :(