我正在研究C#控制檯應用程序。我的目標是創建一個名爲GroupEntity的對象,最好是非泛型類型的對象。在非泛型類C中包裝泛型類#
此GroupEntity對象內部將是一個'AttributeFilter'對象的列表,其中包含通用類型的對象,其中包含Active Directory中的用戶對象上的屬性名稱以及這些用戶對象的可能值。我希望AttributeFilter對象採用通用類型的原因是因爲AD中用戶對象的某些屬性是字符串,有些是int32,有些是int64等。
這裏是我的類(我剪掉了構造函數等以節省空間)
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>>
字段。問題是我不知道T將是什麼,直到我運行的Program.cs
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>
我似乎無法弄清楚這個問題。
創建'AttributeFilter'的非泛型'AttributeFilter'基類,並引用GroupEntity中的基類。 –
你的系統中的GroupEntity對象的實際用例是什麼?可以有三個字段('List>','List >','List >')是一個解決方案嗎?否則,如果你在編譯時不知道類型參數,泛型很可能不是要走的路。 –
這些只是三個例子。基本上我試圖爲AD用戶屬性中使用的任何數據類型創建AttributeFilter。字符串,long和int32是常見的。但是我也看到了string [],byte [],DateTime等等。所以我將不得不創造所有這些。 –
user5078178