以编程方式提取实现通用接口的单一实例

本文关键字:接口 单一 实例 编程 方式 提取 实现 | 更新日期: 2023-09-27 18:32:23

我正在使用一些遗留的 ASP.NET MVC代码,其中包含许多相当详细的XML配置文件。每个文件在运行时都加载到定义为 Singleton 类的对象表示形式中。

我想要一种方法,而不是专门按类类型引用每个单例,然后能够基于它们必须全部实现的接口访问它们通用的属性和方法。

例如,这些单例都具有一个名为"文件名"的字符串实例属性,该属性是它们表示的配置文件的名称。因此,我想自动生成这些文件名的列表,而无需手动引用每个单例来获取该属性,因此我需要以编程方式获取实现指定 Filename 属性的接口的所有单例实例,然后通过强制转换为该接口来获取该属性值。

这可能吗?

以编程方式提取实现通用接口的单一实例

你提到了一个简单的单例布局,所以我用它来测试:

public interface IConfig { }
public class Config1 : IConfig
{
    public static Config1 Config = new Config1();
    private Config1()
    {
        FileName = "file.xml";
    }
    public string FileName { get; private set; }
}

要获取所有文件名,您可以使用这堆 linq:

var types = AppDomain.CurrentDomain.GetAssemblies()
    .SelectMany(a => a.GetTypes())
    .Where(x => typeof (IConfig).IsAssignableFrom(x) && !x.IsAbstract)
    .ToList();
var objects = types.Select(x => x.GetFields().Single(y => x == y.FieldType).GetValue(null))
    .ToList();
var fileNames = objects.Select(x => x.GetType().GetProperty("FileName").GetValue(x)).ToList();

也许您必须更改程序集才能根据需要进行搜索。