1

我有一个自定义控件。此自定义控件大量使用反射。在自定义控件程序集中,我有一个类,它是一个反射管理器。它处理控件中与反射相关的所有内容。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只在自定义控件类中使用,我会在那里创建一个实例。问题是自定义控件使用的列类型,都继承自ColumnBaseColumnBase有一个abstract函数,在大多数继承的列类型中都使用了DataReflection管理器。所以我可以传递实例,但我正在寻找一个更智能的解决方案。

4

2 回答 2

2

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

于 2013-01-07T16:53:14.250 回答
0

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

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

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

反射管理器通过控件构造函数中的反射创建字典,然后控件存储它。

于 2013-01-10T04:44:50.277 回答