我有一个外部函数,它有以下语法:
public void Set<FieldType>(
Field field,
FieldType value
)
字段类型可以是一些基元类型,如int、double和bool等,也可以是这些类型的泛型列表,例如IList<int>
问题是,我必须通过一个IList<T>接口。如果我传递任何实现IList<T>接口函数抛出的InvalidOperationException不支持的类型: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),但我需要转换为接口。
请给我如何实现目标的建议。
您可以包装外部函数:
public void SetWrapper<T>(Field field, List<T> list) {
entity.Set(field, (IList<T>)list);
}