9

我有一段时间没睡了,所以这可能比我想象的要容易。

我有一个或多或少的通用类:

public class Reference<T> where T : APIResource //<- APIResource is abstract btw
{
    private T _value = null;
    public T value
    { 
        get { return _value; }
    }
}

在其他地方,在自定义序列化方法中,有人传入一个object实际上是Reference<(something)>. 我只是想跳到每个Reference<>对象都有的“值”属性,所以我想去:

string serialize(object o)
{
    return base.serialize( ((Reference<>) o).value );
}

当然,生活并不是那么简单,因为正如编译器所说:

using the generic type "Reference<T>" requires 1 type arguments

我怎样才能做我想做的事?

4

3 回答 3

14

您可以使用以下属性创建协变通用接口:

interface IReference<out T> where T : ApiResource {
    T Value { get; }
}

然后,您可以IReference<Anything>转换为IReference<object>IReference<ApiResource>

于 2013-05-28T15:24:07.080 回答
3

SLaks 的答案是完美的。我只想扩展一点:

在某些情况下,您不能用接口替换类。只有在这种情况下,您可能想要使用dynamic功能,以便您可以调用value属性:

string serialize(object o)
{
    if(typeof(Reference<>) == o.GetType().GetGenericTypeDefinition())
        return base.serialize( ((dynamic)o).value );

    //in your case you will throw InvalidCastException
    throw new ArgumentException("not a Reference<>", "o"); 
}

这只是另一种选择,我建议非常小心地使用它。

于 2013-05-28T15:37:07.933 回答
1

不要忘记检查它是否是泛型类型---> o.GetType().IsGenericType, before

使用 o.GetType().GetGenericTypeDefinition() 否则它会抛出异常..

于 2014-04-08T14:24:59.177 回答