我有一个自定义控件。此自定义控件大量使用反射。在自定义控件程序集中,我有一个类,它是一个反射管理器。它处理控件中与反射相关的所有内容。PropertyInfo
它所做的一件事是缓存DataSource
. 我想做它,static
以便我可以在自定义控件类以及程序集中的其他支持类中轻松使用它。问题是这个控件在多个地方使用,并且具有不同的数据源,并且每个都有自己的PropertyInfo
对象集合。
创建此类的最佳方法是什么,以便它具有每个控件实例的实例,并且也可用于自定义控件程序集中的其他类。
我想到的一件事是将我在自定义控件类中创建的反射管理器的实例插入到一个属性中/尽管支持类的构造函数(ala DI),但也许有更好的模式我只是没有意识到。
编辑:抱歉不清楚。该项目是一个 ASP.NET WebForms 项目。控制是CompositeDataBoundControl
重要的。
编辑 2:我将详细说明我的设计以及我在其中看到的缺陷。我有一个正在使用(或计划在多个页面中使用)的自定义控件类。在这个控件里面我有这个类(对不起,如果我有一些语法错误,我是从内存中写出来的)。这不是整个课程,只是这里相关的内容。
public static class DataReflectionManager
{
private static Dictionary<string, PropertyInfo> _propertyInfos = new Dictionary<string, PropertyInfo>();
public static void RegisterDataSource(IEnumerable dataSource)
{
//Get the property info of each property of and
//stick it in the dictionary.
}
public static string GetValueByPropertyKey(object o, string key)
{
//Takes o and gets the value of property key by the PropertyInfo object.
return "";
}
}
现在这个类不能保持静态,否则自定义控件的所有实例的字典将相同,并且它们每个都有自己的数据源,其中包含不同类型的对象。所以......静电已经出来了。但那又如何呢?如果我DataReflectionManager
只在自定义控件类中使用,我会在那里创建一个实例。问题是自定义控件使用的列类型,都继承自ColumnBase
并ColumnBase
有一个abstract
函数,在大多数继承的列类型中都使用了DataReflection管理器。所以我可以传递实例,但我正在寻找一个更智能的解决方案。