Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 4.0 类型为“通用”;";使用反射_C# 4.0 - Fatal编程技术网

C# 4.0 类型为“通用”;";使用反射

C# 4.0 类型为“通用”;";使用反射,c#-4.0,C# 4.0,我可以做以下事情吗 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.G

我可以做以下事情吗

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> ??    
    });
}
publicstatict-Merge()
{
对象x=Activator.CreateInstance();
//用x做一些事情
返回(T)x;
}
私有静态类型[]GetTypesInNamespace(程序集,字符串命名空间)
{
返回assembly.GetTypes()。其中(
t=>String.Equals(t.Namespace、Namespace、StringComparison.Ordinal)和
!t.IsInterface).ToArray();
}
公共静态void Main()
{
类型[]类型列表=GetTypesInNamespace(
Assembly.getExecutionGassembly(),“Myapplication.Web.DomainObjects”);
Parallel.ForEach(类型列表,类型=>
{
var task1=Task.Factory.StartNew(()=>Merge());
//可以这样做吗?合并??
});
}

如果要使用编译时不知道的类型调用泛型方法,则需要使用反射:

  Parallel.ForEach(typelist, type => {
    var methodInfo = typeof(YourClass).GetMethod("Merge").MakeGenericMethod(type);
    var  task1 = Task.Factory.StartNew(() => methodInfo.Invoke(null, new object[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));
});

嗯,问题是什么?或者这是一个语句对不起,问题就在代码中作为注释。好的,让我解释一下,名称空间“Myapplication.Web.DomainObjects”包含一个自定义对象列表。我不想一个接一个地命名它们并开始一项任务。相反,使用反射来获取这些自定义对象并将其传递给merge。最好实际编辑该问题,并使其更清楚您实际提出的问题。我仍然看不到您提出的问题。编译器在下面的代码中显示“type”错误。var task1=Task.Factory.StartNew(()=>Merge());