将对象强制转换为泛型类型
本文关键字:泛型类型 转换 对象 | 更新日期: 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()否则抛出异常…