2013-03-11 64 views
2

我想創建一個擴展方法,該方法將通過鍵返回一個枚舉值。 的使用將是如何在枚舉上創建擴展方法(c#)

LifeCycle.GetLifeCycle(1) 

或 LifeCycle.GetLifeCycleByValue( 「」)

以下是我認爲的 - 比方說,我有以下枚舉:

public enum LifeCycle 
{ 
    Pending = 0, 
    Approved = 1, 
    Rejected = 2, 
} 

我寫以下爲getByint案例的擴展

public static class EnumerationExtensions 
{ 
    private static Dictionary<int, LifeCycle> _lifeCycleMap = Enum.GetValues(typeof(LifeCycle)).Cast<int>().ToDictionary(Key => Key, value => ((LifeCycle)value)); 

    public static LifeCycle GetLifeCycle(this LifeCycle lifeCycle, int lifeCycleKey) 
    { 
     return _lifeCycleMap[lifeCycleKey]; 
    } 
} 

到目前爲止

LifeCycle.GetLifeCycle(1) 

doenst compile。

這可能嗎?

+4

實際上,你可以編寫* no code *,並使用'var foo =(LifeCycle)1;'。這不是令人滿意的嗎? – Jon 2013-03-11 13:58:05

+0

@Jon不同的是,如果你給它一個無效的值,它會工作得很好,而不是拋出異常。這可能會或可能不會令人滿意。 – Servy 2013-03-11 14:04:31

+1

@Servy:當然。但是如果這是問題,你可以編寫'EnValid(this LifeCycle lc)'方法,該方法在Enum.HasValue(lc.GetType(),lc)'爲'false'時拋出。 – Jon 2013-03-11 14:08:23

回答

5

LifeCycle是類型不是該枚舉的實例。

所以這將彙編:

LifeCycle.Pending.GetLifeCycle(1); 

但這種擴展是毫無意義無論如何,因爲你可以得到一個枚舉通過它的int值直接:

LifeCycle approved = (LifeCycle) 1; 
7

沒有這樣的東西作爲靜態擴展方法,這就是你想要做的。您只能創建在類型實例中運行的擴展方法,而不是類型本身。

1

你只需要投這樣的:

var lifeCycle = (LifeCycle)1; 

這裏舉一些例子:

using System; 

namespace Test 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      var lifeCycle = (LifeCycle)1; 
      Console.WriteLine(lifeCycle); 
      //Output: Approved 
     } 
    } 

    public enum LifeCycle 
    { 
     Pending = 0, 
     Approved = 1, 
     Rejected = 2, 
    } 
}