我有一个具有以下语法的外部函数:
public void Set<FieldType>(
Field field,
FieldType value
)
字段类型可以是一些原始类型,如int、double、bool等,也可以是这些类型的通用列表,例如IList< int >
问题是我必须准确地传递一个IList< T >接口。如果我传递任何实现IList< T >接口的类型,该函数将抛出InvalidOperationException Unsupported type: System.Collections.Generic.List`1[[System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089] ]
例如:
IList<int> list1 = new List<int>();
List<int> list2 = new List<int>();
Entity entity = new Entity();
//this works fine
entity.Set(field, list1);
//Here exception is throw
entity.Set(field, list2);
//works fine as well
entity.Set(field, list2 as IList<int>);
我通过反射动态获取列表的问题
var property = entityType.GetProperty(field.FieldName);
dynamic propertyValue = property.GetValue(myObject, null);
因此, propertyValue 是List< T >,而不是IList< T >,当我将此值传递给外部函数时,我看到了一个异常。
显然,这是一个外部函数的错误。
我唯一的想法是将 propertyValue 转换为IList< T >。但我在编译时不知道 T。
所以,我需要动态投射。我有一个通用列表接口类型,如变量
var genericIListType = typeof (IList<>)
.MakeGenericType(field.ValueType);
但我找不到如何将 propertyValue 转换为这种类型的方法。我只能找到如何将对象转换为其他对象的示例(例如使用Activator.CreateInstance),但我需要转换为接口。
请给我建议如何实现目标。