2016-11-09 36 views
1

獲取列表<>我有一個特殊的情況,其中在反射器之一,我可以得到不同類型,我需要reinflate容器(如使克隆)。這開始發生時,新類型的容器中引入(ObservableCollection<T>反思從列表中<T>(從通用容器類型的容器類型)

在克隆機理是什麼,我發現是這樣的:

if (property.PropertyType.FullName.Contains(ReflectorResources.ListName) || property.PropertyType.FullName.Contains("ConcurrentBag")) 
{ 
    var listElementType = property.PropertyType.GenericTypeArguments[0]; 
    var newList = (property.PropertyType.FullName.Contains(ReflectorResources.IncidentListName)) 
     ? Activator.CreateInstance(typeof(Definitions.Session.Products.Motor.IncidentList<>).MakeGenericType(listElementType)) 
     : property.PropertyType.FullName.Contains("ConcurrentBag") ? Activator.CreateInstance(typeof(ConcurrentBag<>).MakeGenericType(listElementType)) : Activator.CreateInstance(typeof(List<>).MakeGenericType(listElementType));  
    var oneItem = Activator.CreateInstance(listElementType); 
} 

於是,我就重寫一遍,如:

if (new[] { ".Collections." }.Any(o => property.PropertyType.FullName.Contains(o))) 
{ 
    var listElementType = property.PropertyType.GenericTypeArguments[0]; 
    var listType = property.PropertyType; 
    var constructedListType = listType.MakeGenericType(listElementType); 
    var newList = Activator.CreateInstance(constructedListType); 
    var oneItem = Activator.CreateInstance(listElementType); 
} 

然而,它爆炸了:var constructedListType = listType.MakeGenericType(listElementType);帶有錯誤

System.InvalidO perationException:只能在Type.IsGenericParameter爲true的Type上調用方法。

我的猜測是,我需要提取List<Something>List<>型...

我如何獲得普通容器類型容器類型?

+0

快速評論:你爲什麼不直接調用Property.PropertyType的CreateInstance? –

回答

2

取而代之的是:

var listElementType = property.PropertyType.GenericTypeArguments[0]; 
var listType = property.PropertyType; 
var constructedListType = listType.MakeGenericType(listElementType); 

試試這個:

Type listElementType = property.PropertyType.GenericTypeArguments[0]; 
Type constructedListType; 
if (! property.PropertyType.IsGenericTypeDefinition) 
    constructedListType = property.PropertyType; 
else 
{ 
    // Depending on where your property comes from 
    // This should not work in the case the property type is List<T> 
    // How listElementType should allow you to instantiate your type ? 
    var listType = property.PropertyType.GetGenericTypeDefinition(); 
    constructedListType = listType.MakeGenericType(listElementType); 
} 

我也說你應該看看GetGenericTypeDefinition()方法,但已經是AakashM的答案在我寫完之前寫完。
然後,你應該看看他的答案。

1

我會從this answer,這可能回答您有關於反射和泛型任何問題引用:

要在運行時得到一個構造類型的未綁定類型,你可以 使用Type.GetGenericTypeDefinition method

Type listOfInt = typeof(List<int>); 
Type list = listOfInt.GetGenericTypeDefinition(); // == typeof(List<>)