我有一个通用类型如下public class TestGeneric<T>{ public T Data { get; set; } public TestGeneric(T data) { this.Data = data; }}如果我现在有一个对象(来自某个外部源),我从中知道它的类型是某个封闭的TestGeneric ,但我不知道TypeParameterT。现在我需要访问该对象的数据。问题是我无法强制转换对象,因为我不知道到底是哪个TestGeneric关闭的。我用// thx to http://stackoverflow.com/questions/457676/c-reflection-check-if-a-class-is-derived-from-a-generic-classprivate static bool IsSubclassOfRawGeneric(Type rawGeneric, Type subclass){ while (subclass != typeof(object)) { var cur = subclass.IsGenericType ? subclass.GetGenericTypeDefinition() : subclass; if (rawGeneric == cur) { return true; } subclass = subclass.BaseType; } return false;}确保我的对象是泛型类型。有问题的代码如下:public static void Main(){ object myObject = new TestGeneric<string>("test"); // or from another source if (IsSubclassOfRawGeneric(typeof(TestGeneric<>), myObject.GetType())) { // the following gives an InvalidCastException // var data = ((TestGeneric<object>)myObject).Data; // if i try to access the property with reflection // i get an InvalidOperationException var dataProperty = typeof(TestGeneric<>).GetProperty("Data"); object data = dataProperty.GetValue(myObject, new object[] { }); }}我需要数据而不管其类型如何(好吧,如果我可以使用GetType()来请求其类型,那是可以的,但不是必须的),因为我只想使用ToString()将其转储为xml。有什么建议么?谢谢 (adsbygoogle = window.adsbygoogle || []).push({}); 最佳答案 您需要先了解通用类的封闭类型,然后才能访问其通用成员。 TestGeneric<>的使用为您提供了开放类型定义,如果不指定泛型参数,则无法调用该类型。获取属性值的最简单方法是直接考虑使用中的封闭类型:public static void Main(){ object myObject = new TestGeneric<string>("test"); // or from another source var type = myObject.GetType(); if (IsSubclassOfRawGeneric(typeof(TestGeneric<>), type)) { var dataProperty = type.GetProperty("Data"); object data = dataProperty.GetValue(myObject, new object[] { }); }} (adsbygoogle = window.adsbygoogle || []).push({});