【问题标题】:Can I treat an object as implementing an interface from reflection?我可以将对象视为通过反射实现接口吗?
【发布时间】:2015-01-14 12:36:28
【问题描述】:

我正在尝试从所有实现接口的 DLL 加载类型。我希望能够从 DLL 中获取类型,创建每种类型的实例,然后将每种类型视为实现接口。我在下面写了一个基本示例来说明我想要实现的目标。

感谢您的帮助

    class Program
    {
        private static List<IJob> _jobs; 

        static void Main(string[] args)
        {
            LoadJobs();

            foreach (var job in _jobs)
            {
                job.Run();
            }

            Console.ReadKey();
        }

        static void LoadJobs()
        {
            _jobs = new List<IJob>();

            var jobsPath = Directory.GetFiles(@"C:\Jobs\");

            foreach (var file in jobsPath)
            {
                var assembly = Assembly.LoadFrom(file);

                foreach (var type in assembly.GetExportedTypes())
                {
                   var instance = Activator.CreateInstance(type);
                   var job = instance as IJob;

                    if(job != null)
                        _jobs.Add(job);
                }
            }
        }
    }

【问题讨论】:

  • 你混合了两个概念。 typeType 您将其视为实例。 type as IJob 永远不会是真的。
  • 如果你想检查一个类型是否实现了接口,你可以这样做:type.GetInterfaces().Contains(typeof(IJob))
  • 对不起,我的意思是在发布之前添加实例。我不知道这是否仍然可能。
  • @Dmitry 如果我使用它,它只会返回一个布尔值。我希望能够从它实现的接口中调用实例中的方法。
  • @DanMarionette:为了能够调用方法(在您的情况下不是静态方法),您必须创建一个实例所以你必须调用 constructor(s)

标签: c# dll reflection interface


【解决方案1】:
foreach (var type in assembly.GetExportedTypes().Where(t => t.IsAssignableFrom(typeof (IJob))))
{
    var job = Activator.CreateInstance(type) as IJob;
    if(job != null) _jobs.Add(job);
}

【讨论】:

    猜你喜欢
    • 2010-09-09
    • 1970-01-01
    • 2018-01-25
    • 1970-01-01
    • 2013-02-02
    • 2017-01-07
    • 1970-01-01
    • 2011-04-17
    • 1970-01-01
    相关资源
    最近更新 更多