2

我有一个定义如下的类:

class ProxyWithSetter<T> : ProxyValue where T : Value

它有一个类型的字段

Action<T> Setter;

假设我有一个ProxyValue实例列表,其中一些也是ProxyWithSetter,我怎样才能将一个类型为 的子类的对象传递给我确定为 aValue的那些 s 之一?ProxyValueProxyWithSetter

这里的问题是我需要将其中一个ProxyValues 转换为 a ProxyWithSetter,但转换还需要一个类型参数。我无法提供,因为我要传递给函数的对象的确切类型在编译时是未知的。我只知道它应该是 的子类型Value

基本上,我想这样做

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

强制转换返回 null 因为p它不是 type ProxyWithSetter<Value>,但是没有办法知道它的确切类型。我也不知道. val只知道它确实是一个Value.

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

4

3 回答 3

0

您可以使用以下方式获取有关类型的信息

p.GetType()

使用它,您将获得一个类型对象,其字符串表示形式类似于

ProxyWithSetter[Value]

您可以访问泛型类型

p.GetType().GenericTypeArguments

由所有类型对象组成的数组,这些类型对象是您的类的通用参数。然后检查

p.getType().GenericTypeArguments == typeof(Value)
于 2013-03-18T21:01:34.980 回答
0

你不能按照你的要求去做。即使您制作了一个包含Setter(必须是属性,而不是字段)的逆变接口,它也只能获取类型T或更多派生的项目。

For instance, if you have a class SuperValue which subclasses Value and then you have an instance of ProxyWithSetter<SuperValue>, you cannot pass an instance of Value to it. It MUST be SuperValue or something subclassing SuperValue.

So the problem is that not every ProxyWithSetter<T> can accept an input of type Value to its Setter.

于 2013-03-19T02:04:16.367 回答
0

You might create this interface:

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

And implement it something like:

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

    //other things
}

That way, in a context where the type is statically known, your Setter will take a T, but in your method you're speaking of, you can do an as IProxyWithSetter and then call Setter(val).

于 2013-03-19T18:48:30.570 回答