将对象转换为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 IReferenceIReferenceIReference

SLaks答案是完美的。 我只想稍微扩展一下:

有时情况下,您无法用接口替换类。 只有在这种情况下,您可能希望使用dynamicfunction,以便可以调用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..