我正在开发一个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>
我似乎无法弄清楚这个问题。
答案 0 :(得分:2)
或多或少你不能。
使用不同类型实例化的通用类型彼此没有关系(即AttributeFilter<long>
和AttributeFilter<int>
没有获得任何公共基类 - 它们与Exception
和{{不同1}})。因此,没有办法将这些类型的实例放入具有强类型的单个集合中。
标准解决方案 - 为您的HttpClient
类型使用非通用基类或接口。或者 - 将它们存储为AttributeFilter<T>
的集合并丢失所有类型的安全性,或者可能是集合object
,这至少使您有机会调用方法(以反思为代价)。