2010-02-18 138 views
3

拿這個枚舉例如:幫助創建枚舉擴展幫助

public enum PersonName : short 
{ 
    Mike = 1, 
    Robert= 2 
} 

我wnat有恩這樣的擴展方法:

PersonName person = PersonName.Robert; 
short personId = person.GetId(); 
//Instead of: 
short personId = (short)person; 

任何想法如何實現這一點?

它需要是通用的int,short等...以及通用枚舉,以及不限於PersonName。

+0

你在問什麼? – SLaks 2010-02-18 22:45:30

+0

這是不可能的。 (你不能建立一個基於'enum'的基礎類型的方法) – SLaks 2010-02-18 22:53:44

+0

爲什麼你需要一個擴展方法來做到這一點?投射到基礎類型已經很簡單,如'(int)SomeEnum.SomeValue' – 2010-02-19 08:07:10

回答

2

這是完全不可能的。

您不能約束基於enum的基礎類型的方法。

說明:

這裏是如何你可以試試這樣做:

public static TNumber GetId<TEnum, TNumber>(this TEnum val) 
     where TEnum : Enum 
     where TEnum based on TNumber 

第一個條件是unfortunately not allowed by C#,第二約束不是由CLR支持。

+0

你可以「排序」(當然,你創建效果) - http://msmvps.com/blogs/jon_skeet/archive/2009/09/10/generic-constraints-for-enums-and-delegates.aspx – adrianbanks 2010-02-18 23:07:23

+0

另見:http://stackoverflow.com/questions/7244/anyone-know-a-good-workaround-for-the-lack-of-an-enum-generic-constraint – 2010-02-19 08:08:29

0

我相信你應該能夠在PersonName類中定義的擴展方法:

public static class PersonExtensions // now that sounds weird... 
{ 
    public static short GetID (this PersonName name) 
    { 
     return (short) name; 
    } 
} 

端節點:不知何故,我希望在你的問題的代碼是過於簡化的,因爲它似乎並不十分權利實施一個人存儲庫作爲枚舉:)

+0

我希望它是一個通用的。當然這是一個例子:) – 2010-02-18 22:53:33

+0

對不起,沒有在你的問題中發現。恐怕我不確定在這種情況下你的意思是「通用」,但似乎其他人已經想通了:) – 2010-02-18 23:13:46

0

是否有任何理由,你不能把它變成一個類?在一個班級的背景下,這可能會更有意義。

+0

好點。以及如何使用reflation獲取人物屬性名稱?或者每個人都應該返回字典?我會考慮一下。這個問題對我來說仍然很有趣。 – 2010-02-18 22:52:39

0

我只想使用類似IEnumerable<KeyValuePair<string,short>>Dictionary<string,short> ......如果需要,您可以將擴展添加到IDictionary或IEnumerable。

+0

那我現在要用的。但是關於這個問題,我想要很多時間,但從我的知識來看,這是不可能實現的。 – 2010-02-18 22:55:50

2

那麼,它的排序的可能,但在另一面,你將有指定的基本類型是什麼:

public static T GetId<T>(this Enum value) 
         where T : struct, IComparable, IFormattable, IConvertible 
{ 
    return (T)Convert.ChangeType(value, typeof(T)); 
} 

因爲System.Enum是基類所有枚舉類型。說它:

PersonName person = PersonName.Robert; 
short personId = person.GetId<short>(); 

既然你可以投幾乎什麼long,你甚至可以有這樣的:

public static long GetId(this Enum value) 
{ 
    return Convert.ToInt64(value); 
} 

,並呼籲:

PersonName person = PersonName.Robert; 
long personId = person.GetId(); 

是什麼,否則可能是得到一個object實例返回,像這樣左右:

public static object GetId(this Enum value) 
{ 
    return Convert.ChangeType(task, Enum.GetUnderlyingType(value.GetType())); 
} 

PersonName person = PersonName.Robert; 
var personId = (short)person.GetId(); 
// but that sort of defeats the purpose isnt it? 

所有這些都涉及某種拳擊和拆箱。第二種方法看起來更好(甚至可以使它成爲標準類型int),然後是第一種。