我正在处理一些遗留的ASP.NET MVC代码,这些代码包含许多相当详细的XML配置文件。每个文件都被加载到在运行时定义为Singleton类的对象表示中。
而不是必须特别通过类类型I来引用每个单例,并且喜欢以编程方式获取每个单独的方法,然后能够访问它们共有的属性和方法,所有这些都基于它们必须全部的接口实施
例如,这些单例都有一个名为" Filename"的字符串实例属性。这是它们代表的配置文件的名称。因此,我希望自动生成这些文件名的列表,而无需手动引用每个单例来获取属性,因此我需要以编程方式获取实现指定Filename属性的接口的所有单例实例,然后获取该属性通过强制转换为该接口的值。
这可能吗?
答案 0 :(得分:1)
你提到了一个简单的单例布局,所以我用它来测试:
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();
也许您必须根据需要更改程序集以进行搜索。