2010-08-10 55 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 2010-08-10 08:39:03

+0

對不起,問題是在那裏的代碼作爲comment.Ok讓我解釋一下,名稱空間「Myapplication.Web.DomainObjects」包含一個自定義對象的列表。我不想一一命名它們並開始一個任務。而是使用反射來獲取這些自定義對象並將其傳遞給合併 – Princeton 2010-08-10 08:43:06

+0

最好是實際編輯問題並使其更清楚您實際要求的內容。 – 2010-08-10 08:51:15

回答

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])); 
    });