我有自定义控件。此自定义控件大量使用Reflection。在自定义控件程序集中,我有一个类,它是一个反射管理器。它涉及控件中与之相关的所有反射。它所做的一件事是为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管理器。所以我可以通过实例,但我正在寻找更智能的解决方案。
答案 0 :(得分:2)
由于您不能拥有多个静态类实例,我可以通过添加一个由控件类名称键控的静态Dictionary<>
来解决这个问题,该控件类名称包含反射管理器的特定于控件的实例。
答案 1 :(得分:0)
我在这里找不到“完美”的解决方案,因为我能做到的每一种方式都有一些我们特定设计的缺点。
帮助我了解当前解决方案的想法是ProperyInfo
对象列表与控件的特定实例相关联,因此用于存储它的Dictionary<string, PropertyInfo>
也应该是控件类的成员。这使我能够保持反射管理器的静态,并在支持类中进行最少的代码更改。
支持类在各自的构造函数中根据需要获取PropertyInfo
个对象。
反射管理器通过控件构造函数中的反射创建了字典,并从那里开始,控件存储它。