将对象转换为generics类型
我有一段时间没有睡觉所以这可能比我想象的要容易。
我有一个或多或少的generics类:
public class Reference where T : APIResource //<- APIResource is abstract btw { private T _value = null; public T value { get { return _value; } } }
在其他地方,在自定义序列化方法中,有人传入的object
实际上是Reference
一个实例。 我只想跳到每个Reference
对象都有的“value”属性,所以我想去:
string serialize(object o) { return base.serialize( ((Reference) o).value ); }
当然,生活并不那么简单,因为正如编译器所说:
using the generic type "Reference" requires 1 type arguments
我怎么能做我想做的事?
您可以使用属性创建协变通用接口:
interface IReference where T : ApiResource { T Value { get; } }
然后,您可以将IReference
IReference
为IReference
或IReference
。
SLaks答案是完美的。 我只想稍微扩展一下:
有时情况下,您无法用接口替换类。 只有在这种情况下,您可能希望使用dynamic
function,以便可以调用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"); }
这只是另一种选择,我建议非常小心地使用它。
别忘了检查它的generics类型—> o.GetType()。IsGenericType,之前
使用o.GetType()。GetGenericTypeDefinition()否则抛出exception..