2013-05-16 4 views
2

프로그램을 실행할 때 오류 메시지가 나타나면 다음과 같이 말합니다. 메서드 참조가 methodinfo.invoke (data, null)의 개체 인스턴스로 설정되지 않았습니다. 내가 원하는 것은, 실행 시간에 동적 일반적인 컬렉션을 만들 수있는 XML 파일에 따라 달라집니다, 그것은 할 수있다 list<classname>, dictionary<string, classname>, customgenericlist<T>반사를 통해 제네릭 목록을 동적으로 만들 때 오류가 발생했습니다.

아래는 코드입니다 : 테스트 대상으로 목록을 사용하여이. 그러나

var prop = anobj.GetProperty("Count"); 
Console.WriteLine(prop.GetValue(data, null)); 

,에 캐스팅 좋을 것이다 :

public object InstantiateGeneric(string namespaceName_className, string generic_namespaceName_className) 
     { 
      Type genericType = Type.GetType(namespaceName_className); 
      Type[] typeArgs = {Type.GetType(generic_namespaceName_className)}; 
      Type obj = genericType.MakeGenericType(typeArgs); 
      return Activator.CreateInstance(obj); 
     } 

답변

2

Count이 아닌 방법, 속성입니다 :

data = InstantiateGeneric("System.Collections.Generic.List`1", "System.String"); 
      anobj = Type.GetType("System.Collections.Generic.List`1").MakeGenericType(Type.GetType("System.String")); 
      MethodInfo mymethodinfo = anobj.GetMethod("Count"); 
      Console.WriteLine(mymethodinfo.Invoke(data, null)); 

는 상기 데이터 유형을 인스턴스화하는 코드입니다 비 일반 IList :

var data = (IList)InstantiateGeneric("System.Collections.Generic.List`1", 
            "System.String"); 
Console.WriteLine(data.Count); 

나는 또한 마법 문자열이 아닌 Type이라는 용어로 말하기를 제안합니다.

var itemType = typeof(string); // from somewhere, perhaps external 
var listType = typeof(List<>).MakeGenericType(itemType); 
var data = (IList)Activator.CreateInstance(listType); 
Console.WriteLine(data.Count);