将对象强制转换为泛型类型

本文关键字:泛型类型 转换 对象 | 更新日期: 2023-09-27 18:15:38

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

我有一个泛型类,它或多或少是这样的:

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<>对象都具有的"value"属性,所以我想要执行:

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

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

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

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

将对象强制转换为泛型类型

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

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

可以将IReference<Anything>转换为IReference<object>IReference<ApiResource>

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"); 
}

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

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

之前

using o.GetType().GetGenericTypeDefinition()否则抛出异常…