2013-03-18 67 views
2

我有如下定义一个类:铸造一个泛型实例到非一般的一个

class ProxyWithSetter<T> : ProxyValue where T : Value 

它的类型

Action<T> Setter; 

说我有ProxyValue实例列表的领域,其中一些也是ProxyWithSetter,我怎么能通过一个对象,类型是Value的子类,我确定是ProxyWithSetter的那些ProxyValue之一?

这里的问题是我需要将其中一个ProxyValue s投射到ProxyWithSetter,但是投射也需要一个类型参数。我不能提供,因为精确类型的对象我要传递给函数不知道在编译时间。我只知道它应该是Value的子类型。

基本上,我想做的事,因为pProxyWithSetter<Value>类型的不是这个

(p as ProxyWithSetter<Value>).Setter(val); 

演员返回空值,但是没有办法知道确切的类型是。我也不知道EXACT类型val。只要知道它确实是一个Value

我可以理解为什么它不起作用。我只是在寻找一个可行的解决方法。

+0

p最初是什么类型? (我不明白动作适合在哪里) – James 2013-03-18 20:40:31

+0

动作是ProxyWithSetter 的一个字段。它在实例创建时被设置为某种具体类型,但随后所有这些实例都被推入列表,并且具体类型丢失。 – 2013-03-18 20:42:11

回答

0

您可以创建这个接口:

interface IProxyWithSetter 
{ 
    Action<Value> Setter { get; } 
} 

并执行它是这样的:

class ProxyWithSetter<T> : ProxyValue, IProxyWithSetter where T : Value 
{ 
    Action<Value> IProxyWithSetter.Setter { get { return x => this.Setter((T)x); } } 

    //other things 
} 

这样一来,在类型是静态已知的情况下,你Setter将采取T,但在你说的方法中,你可以做一个as IProxyWithSetter,然后打电话给Setter(val)

+0

这对我的最终解决方案来说非常接近(也许更优雅)。我会将其标记为已接受的答案。 – 2013-03-19 20:34:47

0

可以使用

p.GetType() 

使用这种获取关于类型的信息,你会得到一个类型的对象,其字符串表示是一样的东西

ProxyWithSetter[Value] 

您可以访问泛型类型与

p.GetType().GenericTypeArguments 

一个由所有类型对象组成的数组,它们是通用参数rs为你的班级。 然后,只需检查

p.getType().GenericTypeArguments == typeof(Value) 
+0

但实际检查哪个ProxyValue是ProxyWithSetter不是问题。我在解决方案中解决了不同的问题。问题是我需要将它转换为“真”类型,所以我可以调用它作为字段的泛型函数。此外,我需要传递一个值给该函数,所以即使我设法投出它,我仍然需要将该值转换为适当的类型... – 2013-03-18 21:07:04

+0

我试过了。当类型(包括泛型参数)正确时,一切正常。你能提供崩溃的代码吗? – 2013-03-18 21:38:39

0

你不能做什么你问。即使你制作了一个包含Setter(它必须是一个属性,而不是一个字段)的逆变界面,它也只能得到T或更多派生类型的项目。

举例来说,如果你有一个类SuperValue其子类Value,然后你有ProxyWithSetter<SuperValue>一个实例,你不能的Value一个实例传递给它。它必须是SuperValue或子类SuperValue

所以问题是,并非每个ProxyWithSetter<T>都可以接受ValueSetter的输入。