以编程方式提取实现通用接口的单一实例
本文关键字:接口 单一 实例 编程 方式 提取 实现 | 更新日期: 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();
也许您必须更改程序集才能根据需要进行搜索。