计算时间长

这是我前一个问题的链接,这引导我进入这个问题。 C#嵌套的foreach循环优化

计算时间仍然很长,我不确定原因是什么。

object foo; List StringList = new List(); // Populated by previous code Dictionary assemblyTypes = RandomAssembly.GetTypes().ToDictionary(t => t.Name, t => t); foreach (String name in StringList) { if (assemblyTypes.ContainsKey(name)) { // Create an instance of the matching class and add it // to the appropriate lists. Type at = assemblyTypes[name]; foo = Activator.CreateInstance(at); ArbitraryList1.Add(foo); } } 

如果计算时间明显变慢,我猜你会调用很多代码,并且在编译时你会想到很多你不太了解的对象。

您不想将类保存在Dictionary并调用CreateInstance而是希望保留其构造函数Dictionary以便您可以直接调用它们,而无需每次使用reflection查找它。

这样你就可以调用AssemblyConstructors [Name] .Invoke()来创建一个新的类实例。

这样,您只需使用一次reflection来查找构造函数。

 // keep a dictionary of constructors (instead of the types) var Constructors = new Dictionary(); // add this class to this dictionary Type t = typeof(SomeClass); string name = t.Name; Constructors[name] = t.GetConstructors()[0]; // use reflection only once here, afterwards we reuse the reflected info // new up an instance var o = Constructors[name].Invoke(new object[] {}); 

我认为第一个构造函数将是无参数构造函数。 否则尝试类似t.GetConstructors().Where(x => x.GetParameters().Count() == 0).First(); 这是我所知道的最简单的方法,因为显然你无法获得构造函数的委托 。

如果您编写自己正在创建的类,则可以使用一个公共基类或接口来创建一个方法,这样您就可以将委托保留给该构造函数,这甚至更快。

这篇文章也有一些有趣的想法,进一步优化。 如果你想快速做到这一点,你可以。 几乎与调用new KnownClass()一样快

祝好运,

GJ

简介:基本上无限制的循环与每次迭代中调用的框架中最慢的函数之一将是缓慢的。

有多种方法可以避免reflection,但没有任何其他信息,你只需要忍受它。

使用Dictionary.TryGetValue查找“name”键一次而不是两次。 这只是一个小小的提示,因为我确信反思是瓶颈。