将泛型类包装在非泛型类C#中

时间:2017-04-06 18:48:53

标签: c#

我正在开发一个C#控制台应用程序。我的目标是创建一个名为GroupEntity的对象,最好是非泛型类型。

在此GroupEntity对象中,将包含一个'AttributeFilter'对象列表,该对象包含Generic类型的对象,该对象包含Active Directory中用户对象的属性名称以及这些用户对象的可能值。我希望AttributeFilter对象采用泛型类型的原因是因为AD中用户对象的某些属性是字符串,有些是int32,有些是int64等。

这是我的课程(我已经删除了contructorse等以节省空间)

    public class AttributeFilter<T> : IEqualityComparer<AttributeFilter<T>>
        {
            private string _attributeName;      
            private T _attributeValue;         
            private List<T> _attributeValues { get; set; }  

            public AttributeFilter(string attributeName)
            {
                AttributeName = attributeName;
                _attributeValues = new List<T>();
            }

            public void AddValues(T attributeValue)
            {
                AttributeValue = attributeValue;
                if (!_attributeValues.Contains(AttributeValue))
                {
                    _attributeValues.Add(AttributeValue);
                }
            }

// Ive cut out the getter setter etc that is not relevant
}

这是GroupEntity类。请注意我有一个

List<AttributeFilter<T>>

字段。问题是我在运行program.cs之前不知道T会是什么

public class GroupEntity<T>
{
    private string _groupName;

    // because I want to a have a List<AttributeFilter<T>>, but I dont really want this here. because of program.cs when I initialise  a new GroupEntity<> I have to tell it what type. I wont know. The type could be int32, string, long or whatever.
    private List<AttributeFilter<T>> _filters;

    public void AddFilters(AttributeFilter<T> attributeFilter)
    {
        if (!_filters.Contains(attributeFilter, attributeFilter))
        {
            _filters.Add(attributeFilter);
        }
    }

    public GroupEntity()
    {
        _filters = new List<AttributeFilter<T>>();
    }

    public GroupEntity(string groupName) : this()
    {
        _groupName = groupName;
    }

}

现在我使用program.cs来初始化和测试......

    class Program
    {
        static void Main(string[] args)
        {

            // Create AttributeFilter object for user attribute: EYAccountType
            var at1 = new AttributeFilter<string>("EYAccountType");
            at1.AddValues("02");            
            at1.AddValues("03");
            at1.AddValues("04");
            at1.AddValues("05");


            // try adding anothr AtributeFilter with same name. 
            var at3 = new AttributeFilter<string>("EYAccountType1");
            at3.AddValues("06");
            at3.AddValues("07");



            // Create AttributeFilter object for user attribute: userAccountControl
            var at2 = new AttributeFilter<int>("userAccountControl");
            at2.AddValues(512);
            at2.AddValues(544);
            at2.AddValues(546);
            at2.AddValues(4096);


            // Now create a GroupEntity object 
            var group1 = new GroupEntity<string>("My_First_AD_Group_Name");


            // Try adding the above two AttributeFilter objects we created to the GroupEntity object.
            group1.AddFilters(at1);
            group1.AddFilters(at3);

            // This is the problem. I know why this is happening. because I initialised the var group1 = new GroupEntity<string>. So it wont accept at2 because at2 is taking in int. 
            //group1.AddFilters(at2);

}

那么如何在没有泛型参数的情况下编写GroupEntity类,这样我就可以在其中包含各种类型的AttributeFilter<T>。例如,我可以暂停AttributeFilter<int>AttributeFilter<string>以及AttributeFilter<long>

我似乎无法弄清楚这个问题。

1 个答案:

答案 0 :(得分:2)

或多或少你不能。

使用不同类型实例化的通用类型彼此没有关系(即AttributeFilter<long>AttributeFilter<int>没有获得任何公共基类 - 它们与Exception和{{不同1}})。因此,没有办法将这些类型的实例放入具有强类型的单个集合中。

标准解决方案 - 为您的HttpClient类型使用非通用基类或接口。或者 - 将它们存储为AttributeFilter<T>的集合并丢失所有类型的安全性,或者可能是集合object,这至少使您有机会调用方法(以反思为代价)。