如何使用反射调用方法
本文关键字:方法 调用 反射 何使用 | 更新日期: 2023-09-27 18:27:35
我得到了实现接口的所有类。我想在创建对象实例时调用一个方法
var types =AppDomain.CurrentDomain.GetAssemblies().ToList()
.SelectMany(s => s.GetTypes())
.Where(t => typeof(IManagerReport).IsAssignableFrom(t));
Console.WriteLine("Processing manager reports..");
foreach(var TheType in types)
{
//error here
var temptype = Activator.CreateInstance(TheType) as IManagerReport;
temptype.Load();
temptype.Save();
Console.WriteLine("Saved to: " + temptype.SavePath);
}
产生的错误在这里:
无法创建接口的实例
确保从要获取的类型选择中排除IManagerReport。
var types =AppDomain.CurrentDomain.GetAssemblies().ToList()
.SelectMany(s => s.GetTypes())
.Where(t => typeof(IManagerReport).IsAssignableFrom(t)
&& typeof(IManagerReport) != t
&& !t.IsInterface
&& !t.IsAbstract
&& !t.IsGenericTypeDefinition);
问题是,在可枚举的类型中,不仅有IManagerReport的派生类型,还有IManagerReports本身。不能创建接口的实例,只能创建类。使用我发布的代码来排除大多数问题项,但我仍然会在Activator.CreateInstance上添加try/catch。您可能有没有无参数公共构造函数的派生类型。这些也会失败。
用try/catch结束通话,然后继续。我想说你应该考虑到这里的所有可能性,但它们太多了。考虑到一些,然后也考虑到由于其他原因,创作根本不起作用的可能性。
try {
var temptype = Activator.CreateInstance(TheType) as IManagerReport;
} catch {
continue;
}
这里的问题是IManagerReport
与Where
谓词匹配,因此将是foreach
语句中的值之一。您需要过滤掉Where
子句中的接口以及
var types =AppDomain.CurrentDomain.GetAssemblies().ToList()
.SelectMany(s => s.GetTypes())
.Where(t => typeof(IManagerReport).IsAssignableFrom(t));
.Where(t => !t.IsInterface && !t.IsAbstract);
尝试添加任一
.Where(t=>t.IsClass)
或
.Where(t=>!t.IsInterface)
到您的LINQ查询