2

我有一个具有以下语法的外部函数:

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

字段类型可以是一些原始类型,如intdoublebool等,也可以是这些类型的通用列表,例如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),但我需要转换为接口。

请给我建议如何实现目标。

4

1 回答 1

5

您可以包装外部函数:

public void SetWrapper<T>(Field field, List<T> list) {
    entity.Set(field, (IList<T>)list);
}
于 2012-09-03T10:21:24.577 回答