如何使用反射调用方法

本文关键字:方法 调用 反射 何使用 | 更新日期: 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;
}

这里的问题是IManagerReportWhere谓词匹配,因此将是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查询