2010-08-10 59 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])); 
    });