我有一段时间没有睡觉所以这可能比我想象的要容易。
我有一个或多或少的泛型类:
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
我该怎样做我想做的事?
答案 0 :(得分:14)
您可以使用属性创建协变通用接口:
interface IReference<out T> where T : ApiResource {
T Value { get; }
}
然后,您可以将IReference<Anything>
投射到IReference<object>
或IReference<ApiResource>
。
答案 1 :(得分: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");
}
这只是另一种选择,我建议非常谨慎地使用它。
答案 2 :(得分:1)
别忘了检查它的通用类型是否---&gt; o.GetType()。IsGenericType,在
之前使用o.GetType()。GetGenericTypeDefinition()否则抛出异常..