您可以在您的收藏這樣的運行強制約束:
public class ConstrainedTypeCollection<TBaseType> : Collection<Type>
{
protected override void InsertItem(int index, Type item)
{
if (!typeof(TBaseType).IsAssignableFrom(item))
throw new ArgumentException("The type is incompatible.", "item");
base.InsertItem(index, item);
}
protected override void SetItem(int index, Type item)
{
if (!typeof(TBaseType).IsAssignableFrom(item))
throw new ArgumentException("The type is incompatible.", "item");
base.SetItem(index, item);
}
}
編輯:你也可以做到以下幾點只要您撥打得到充分的編譯時類型安全通用的Add<T>()
,Contains<T>()
和Remove<T>()
方法。
public class ConstrainedTypeCollection<TBaseType> : ICollection<Type>
{
private readonly List<Type> _collection = new List<Type>();
public void Add<T>()
where T : TBaseType
{
_collection.Add(typeof(T));
}
public bool Contains<T>()
where T : TBaseType
{
return _collection.Contains(typeof(T));
}
public bool Remove<T>()
where T : TBaseType
{
return _collection.Remove(typeof(T));
}
public int Count
{
get
{
return _collection.Count;
}
}
bool ICollection<Type>.IsReadOnly
{
get
{
return false;
}
}
public void Clear()
{
_collection.Clear();
}
public void CopyTo(Type[] array, int arrayIndex)
{
_collection.CopyTo(array, arrayIndex);
}
public IEnumerator<Type> GetEnumerator()
{
return _collection.GetEnumerator();
}
#region ICollection<Type> Members
void ICollection<Type>.Add(Type item)
{
VerifyType(item);
_collection.Add(item);
}
bool ICollection<Type>.Contains(Type item)
{
VerifyType(item);
return _collection.Contains(item);
}
bool ICollection<Type>.Remove(Type item)
{
VerifyType(item);
return _collection.Remove(item);
}
System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
private void VerifyType(Type item)
{
if (!typeof(TBaseType).IsAssignableFrom(item))
throw new ArgumentException("The type is incompatible.", "item");
}
}
感謝您的示例。這就是我已經做的,我只是想知道在編譯時是否有可能。 – Jules 2010-01-20 07:35:42
檢查我的編輯另一個選項。 :) – 2010-01-20 08:13:37
這太棒了。事實證明,它可以完成,但有一些相當不尋常的語法!你有沒有想過這個,或者你之前使用過它? – Jules 2010-01-20 16:26:57