我有具有以下句法的外部函數:轉換爲普通接口動態
public void Set<FieldType>(
Field field,
FieldType value
)
字段類型可以是某些基本類型的像INT,雙,布爾等,並且還可以是這些類型的通用列表,例如的IList < int>的
的問題是,我必須通過準確的的IList < T>接口。如果我通過它實現IList的< T>接口的函數拋出InvalidOperationException異常不支持的類型的任何類型的:System.Collections.Generic.List`1 [[System.Int32,mscorlib程序,版本= 4.0.0.0,文化=中性公鑰= 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列表< T>,而不是一個的IList < T>,當我這個值傳遞給外部函數我看到異常。
很明顯,這是一個外部函數的bug。
我唯一的想法是將propertyValue投射到IList < T>。 但我不知道T在編譯時間。
所以,我需要動態投射。我有一個通用的列表類似變量的接口類型
var genericIListType = typeof (IList<>)
.MakeGenericType(field.ValueType);
但我找不到如何將propertyValue轉換爲此類型的方式。我只能找到如何將對象投射到其他對象的示例(例如使用Activator.CreateInstance),但我需要將其投射到接口。
請給我建議如何實現目標。
謝謝你,大衛。該解決方案比您所建議的更簡單:public static void SetWrapper(此實體實體,字段字段,IList 值) entity.Set(field,value); } –