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

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

问题描述:

编辑:将错误的术语装箱更改为转换。C#在运行时动态地转换通用对象

我有以下问题:

如果我创建类型Action或者Func键的新代表将浇铸为类型的委托。

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)的类型。

一种解决方案可能是投委托像这样:

if(@delegate is Action) 
    Example.Create((Action)@delegate).GenericType(); 

但由于Delegate.CreateDelegate还可以创建行动或Func键代表,就不可能检查所有的变化。

我不能改变泛型类,所以我必须施放委托。

我希望我能解释我的问题。我不是以英语为母语的人......

编辑:问题是typeof(T)没有返回对象的“真实”类型。但我恐怕没有解决办法。

+6

你真的需要像这样的代表工作吗?也停止使用@delegate和@object。在我意识到你正在缩短保留名称之前,我正盯着它一分钟。 – Euphoric 2011-03-05 22:35:29

+0

这样下来很糟糕只有值类型的值被装箱,委托类型是一个引用类型,不太确定你想要做什么,但是你用Delegate.DynamicInvoke()方法调用委托对象迟了一步 – 2011-03-05 22:38:49

+0

我没有像C#中的“委托”或“对象”这样的快捷方式,它打破了类应该是骆驼式的转换,所以这就是我的复仇^^ 是的,我需要像这样的代表: – jhlllnd 2011-03-05 22:46:16

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

@delegate.GetType()有什么问题来获取代表的实际类型?

另外,一个附注:你滥用术语“拳击”。

+0

我无法访问@delegate变量,这在示例中是一个错误。 – jhlllnd 2011-03-05 22:38:28

+1

除非使用反射,否则不能使用类型对象动态转换,这就是问题所在。 – Femaref 2011-03-05 22:38:37

+0

@delegate就像(Delegate)new Action(...),所以它被装箱到Delegate。或不? – jhlllnd 2011-03-05 22:41:25

如果你能.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()})); 
    }