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());