我知道這是一個奇怪的標題,我知道繼承是不可能的枚舉,所以讓我解釋一下。模擬多態/泛型枚舉 - C#
,如果我有以下類:
- 水果(抽象)
- 蘋果(混凝土 - 從水果派生)
- 橙色(混凝土 - 從水果派生)
我有以下方法,用泛型實現:
public ICollection<T> FindFruit<T>() where T : Fruit
{
return _fruitRepository
.Fruits
.OfType<T>()
.ToList();
}
我用這樣的:
var apples = _fruitServices.FindFruit<Apple>();
一切都很好。
現在 - 我現在有以下枚舉:
public enum FruitAssociations
{
Color,
Manufacturers
}
基本上是一個「果」可以有很多協會,指定什麼協會從我的倉庫,結果包括。
所以FindFruit
上述方法實際上是這樣的:
public ICollection<T> FindFruit<T>(FruitAssociations[] assocs) where T : Fruit
{
return _fruitRepository
.Fruits
.OfType<T>()
.IncludeAssocs(assocs) // ObjectQuery<Fruit> extension method.
.ToList();
}
這裏是擴展方法:
public static ObjectQuery<Fruit> IncludeAssocs(this ObjectQuery<Fruit> source, FruitAssociations[] assocs)
{
if (assocs.Contains(FruitAssociations.Color))
query = query.Include("Color");
// etc
}
也能正常工作。然而,我現在面臨的問題是我有特別水果協會。
如
public enum OrangeAssociations
{
OrangeFamilies
}
,我不知道如何有一個單一的FindFruit
方法,其能夠根據T.
類型返回協會這是最終的結果,我會希望能夠做到:
var oranges = _fruitServices.FindFruit<Orange>(new[] { OrangeAssociations.OrangeFamilies });
var apples = _fruitServices.FindFruit<Apple>(new[] { AppleAssociations.AppleFamilies });
但我想不出該怎麼辦沒有單獨的FindFruit
方法爲每個水果類型,並因此擊敗泛型T型參數的點。
對於那些對我在這裏做什麼感到好奇的人,我正在使用Entity Framework 4進行熱切加載,因此使用.Include
方法(需要一個指定導航屬性的字符串)。因此,我的服務接受給定實體的枚舉數組,然後使用擴展方法將其轉換爲.Include
語句中使用的字符串。
我想解決的辦法是不是接受枚舉的數組,接受一個泛型類:
public ICollection<T> FindFruit<T>(FruitAssociations<T> assocs) where T : Fruit
而且使用這樣的:
var associations = new FruitAssociations<Orange>(OrangeAssociations.OrangeFamilies);
var apples = _fruitServices.FindFruit<Apple>(associations);
,但我不確定這將如何工作,或如何實施它。
希望我的問題是有道理的,不是太長/複雜。
有趣的...雖然我真的儘量避免屬性(與反思 - 因爲它看起來你的使用等)。我會盡力去做。 – RPM1984 2010-12-09 01:36:50
@ RPM1984:我認爲你有一些原因,你必須使用枚舉。如果你真的沒有這個要求,並且你可以使用類,那麼通過一切手段,類對泛型更好。 – 2010-12-09 01:42:14
還要記住,不要使用反射,你可以檢查Enum類型,將其轉換,然後切換到適當的方法。 – 2010-12-09 01:43:35