动态转换为泛型接口



我有一个外部函数,它有以下语法:

public void Set<FieldType>(
    Field field,
FieldType value
) 

字段类型可以是一些基元类型,如intdoublebool等,也可以是这些类型的泛型列表,例如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);
}

最新更新