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)没有返回对象的“真实”类型。但我恐怕没有解决办法。
答
回答我自己的问题:这是不可能的。 :(
答
如果你能.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()}));
}
你真的需要像这样的代表工作吗?也停止使用@delegate和@object。在我意识到你正在缩短保留名称之前,我正盯着它一分钟。 – Euphoric 2011-03-05 22:35:29
这样下来很糟糕只有值类型的值被装箱,委托类型是一个引用类型,不太确定你想要做什么,但是你用Delegate.DynamicInvoke()方法调用委托对象迟了一步 – 2011-03-05 22:38:49
我没有像C#中的“委托”或“对象”这样的快捷方式,它打破了类应该是骆驼式的转换,所以这就是我的复仇^^ 是的,我需要像这样的代表: – jhlllnd 2011-03-05 22:46:16