2012-09-03 73 views
2

我有具有以下句法的外部函數:轉換爲普通接口動態

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),但我需要將其投射到接口。

請給我建議如何實現目標。

回答

4

你可以換外部函數:

public void SetWrapper<T>(Field field, List<T> list) { 
    entity.Set(field, (IList<T>)list); 
} 
+0

謝謝你,大衛。該解決方案比您所建議的更簡單:public static void SetWrapper (此實體實體,字段字段,IList 值) entity.Set(field,value); } –