“static"自定义控件的每个实例的类实例

本文关键字:实例 自定义控件 static quot | 更新日期: 2023-09-27 17:51:02

我有一个自定义控件。这个自定义控件大量使用反射。在自定义控件程序集中,我有一个类,这是一个反射管理器。它处理控件中与反射相关的所有内容。它所做的一件事是为DataSource中对象的每个属性缓存PropertyInfo对象。我想使它static,所以我可以很容易地使用它内部的自定义控制类和其他支持类内组装。问题是这个控件在几个地方使用,并且使用不同的数据源,并且每个都有自己的PropertyInfo对象集合。

创建该类的最佳方法是什么,以便它具有控件的每个实例的实例,并且也可用于自定义控件程序集中的其他类。

我想到的一件事是将我在自定义控件类中创建的反射管理器的实例插入到一个属性/通过支持类的构造函数(例如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函数,该函数在大多数继承的列类型中使用datarereflect管理器。所以我可以传递实例,但我在寻找一个更智能的解决方案

“static"自定义控件的每个实例的类实例

由于您不能拥有静态类的多个实例,因此我将通过添加一个由控制类名键接的静态Dictionary<>来解决这个问题,该控件包含反射管理器的特定于控件的实例。

我在这里找不到一个"完美"的解决方案,因为我能想到的每一种方法对于我们的特定设计都有一些缺点。

帮助我得出当前解决方案的想法是,ProperyInfo对象的列表绑定到控件的特定实例,因此用于存储它的Dictionary<string, PropertyInfo>也应该是控件类的成员。这允许我保持反射管理器静态,并在支持类中进行最小的代码更改。

支持类在其各自的构造函数中根据需要获取PropertyInfo对象。

反射管理器通过控件构造函数中的反射创建字典,从那里开始,控件存储字典。