2010-08-10 5 views
3

다음 작업을 수행 할 수 있습니까? 당신이 컴파일 타임에 알 수없는 유형의 일반적인 방법을 호출 할 경우리플렉션을 사용하여 일반 "T"로 입력하십시오.

public static T Merge<T>() 
{ 
    object x = Activator.CreateInstance<T>(); 
    //Do some stuff with x 
    return (T)x; 
} 

private static Type[] GetTypesInNamespace(Assembly assembly, string nameSpace) 
{ 
    return assembly.GetTypes().Where(
     t => String.Equals(t.Namespace, nameSpace, StringComparison.Ordinal) & 
      !t.IsInterface).ToArray(); 
} 

public static void Main() 
{ 
    Type[] typelist = GetTypesInNamespace(
     Assembly.GetExecutingAssembly(), "Myapplication.Web.DomainObjects"); 

    Parallel.ForEach(typelist, type => 
    { 
     var task1 = Task.Factory.StartNew(() => Merge<type>()); 
     // is it possible to do this way? Merge<type> ??  
    }); 
} 
+2

eeeeuuuuhmm과 문제는 무엇인가

나는 당신이 정말로 원하는 것은 이런 작은 선물이라고 생각? 또는이 문장이 – Nealv

+0

입니다. 죄송합니다. 질문은 바로 코드에 주석으로 있습니다. 설명해 드리겠습니다. 네임 스페이스 "Myapplication.Web.DomainObjects"에는 사용자 지정 개체 목록이 포함되어 있습니다. 하나씩 이름을 정하고 작업을 시작하고 싶지 않습니다. 대신 이러한 사용자 지정 개체를 가져와 병합에 전달하기 위해 리플렉션을 사용하십시오. – Princeton

+0

실제로 질문을 편집하고 실제로 묻는 내용을 명확하게 만드는 것이 좋습니다. –

답변

0

아니,이 작업을 수행 할 수 없습니다 - 제네릭을 컴파일 타임에 유형을 미리 알았을 때 사용되지만,이 경우에는 그렇지 않습니다.

public static object Merge(Type type) 
{ 
    object x = Activator.CreateInstance(type); 
    //Do some stuff with x 
    return x; 
} 

귀하의 foreach 문이 지금은 약간 다른 모양 :

Parallel.ForEach(typelist, type => 
{ 
    var task1 = Task.Factory.StartNew(() => Merge(type)); 
}); 
0

, 당신은 반사를 사용해야합니다

Parallel.ForEach(typelist, type => { 
    var methodInfo = typeof(YourClass).GetMethod("Merge").MakeGenericMethod(type); 
    var task1 = Task.Factory.StartNew(() => methodInfo.Invoke(null, new object[0])); 
    }); 
관련 문제