首先让我说,我想做的是获取泛型类中的属性值,该值可能被继承自它的类覆盖。在基类中将其视为默认值,类的继承者可以覆盖以设置自己的默认值。
我尝试使用 System.Reflection.FieldInfo.GetValue 直接在类型上使用反射,但这不适用于具有泛型类型的类。所以我认为我需要实例化类才能看到值是什么。
我通过读取 bin 中的 Dll 并使用反射查找从我的接口继承的类型来检索“类型”。
我正在使用 .NET 4.5
这里的文档似乎准确地解释了我需要做什么 http://msdn.microsoft.com/en-us/library/b8ytshk6.aspx
在本文档中,我能看到的唯一区别是我们是如何获得类型的,我在 bin 中查找类型,它们简单地称为 typeof(),由于类型非常复杂,看起来这可能是不匹配的,但我看不到缺少什么(如果有的话)
foreach (var item in types)
{
var ts = item.GetField("DefaultTimeToExpire");
Type[] typeArguments = item.GetGenericArguments();
if (ts != null)
{
var t = item.MakeGenericType(typeArguments);
var obj = Activator.CreateInstance(t);
var timespan = obj.DefaultTimeToExpire;
subscriberInfos.Add(new Tuple<string, Type, TimeSpan>(item.Name, item, timespan));
}
}
到目前为止,我正在调用 GetField 来查找具有“DefaultTimeToExpire”字段的项目,这部分可以很好地找到我需要的类型。接下来我调用 GetGenericArguments,它返回一个 Arguments 类型的预期数组。然后我调用 MakeGenericType 最后创建实例给我错误消息
“无法创建 BusinessLogic.TestSubscriberXXX`1[Message] 的实例,因为 Type.ContainsGenericParameters 为真。”
这看起来正是我应该做的。谢谢