2013-04-22 79 views
3

我想做一些類似partial enum的事情。如果我知道C#不支持這個。我的想法是在MyClass2中做Dictionary<PartialEnum, MyClass>。字典包含從文件加載的一些屬性,我想有可能添加一些其他「屬性」(PartialEnum的成員)。我正在使用Roslyn,因此我可以在運行時編譯枚舉的某些「第二」部分,但不知道如何去做。 (partial static class也不支持,所以我不能用public readonly成員)在運行時編譯的部分枚舉 - 替代

MyClass{ 
    string value; 

    public string Value{ 
    get{ return value;} 
    } 
} 

MyClass2{ 

    private Dictionary<PartialEnum,MyClass> properties; 

} 

我可以使用string像鑰匙,但它是不是很漂亮。那麼,是否可以做這樣的事情:

partial enum PartialEnum{ 
Name, 
Group, ... 
} 

和運行時編譯部分

partial enum PartialEnum{  
runTimeLasName, 
runTimeTitle, ... 
} 
+1

'enum'在編譯時提供對命名值的支持。你試圖在運行時編譯它們有什麼好處?無論代碼如何接受'enum'實際上只是接受'enum'使用的任何值,在C#中這個默認值是'int'。您的動態枚舉值可以在運行時在沒有任何編譯的情況下使用,只要您將相關值簡單地轉換爲枚舉類型,然後將其輸入到使用該類型的方法。它不會與任何已知的價值相關聯,但會保持其基礎價值。無論如何,在運行時你都不會在意這件事。 – 2013-04-22 09:24:51

+0

支持'static partial class'。但我不確定這會對你有幫助,因爲你不能在編譯時創建一個類的一部分,然後在運行時添加一些東西。 – svick 2013-04-22 12:21:46

回答

2

在我看來,你實際上並不需要的enum這裏。您想在運行時爲其添加一些值,這意味着enum不適合您的需求。但是你可以創建一個類。喜歡的東西:

class PartialEnum 
{ 
    private static readonly Dictionary<string, PartialEnum> Values = 
     new Dictionary<string, PartialEnum>(); 

    public string Id { get; private set; } 

    private PartialEnum(string id) 
    { 
     Id = id; 
    } 

    public static PartialEnum GetValue(string id) 
    { 
     PartialEnum value; 
     if (!Values.TryGetValue(id, out value)) 
     { 
      value = new PartialEnum(id); 
     } 

     return value; 
    } 

    public static PartialEnum Name { get { return GetValue("Name"); } } 

    public static PartialEnum Group { get { return GetValue("Group"); } } 
} 

如果你想使用一個預定義值,訪問靜態屬性(例如PartialEnum.Name)。如果要使用運行時定義的值,請使用GetValue()方法(例如PartialEnum.GetValue("runTimeLastName"))。