2009-09-05 2 views
1

Я пытаюсь написать 2 метода расширения для обработки типов Enum. Один из них должен использовать атрибут описания, чтобы дать более подробное объяснение параметрам перечисления и второй метод для перечисления опций перечисления и их описания для использования в списке избранных или какой-либо коллекции.Объединение методов расширения

Вы можете прочитать мой код до сих пор здесь:

<Extension()> _ 
    Public Function ToDescriptionString(ByVal en As System.Enum) As String 

     Dim type As Type = en.GetType 
     Dim entries() As String = en.ToString().Split(","c) 
     Dim description(entries.Length) As String 

     For i = 0 To entries.Length - 1 
      Dim fieldInfo = type.GetField(entries(i).Trim()) 
      Dim attributes() = DirectCast(fieldInfo.GetCustomAttributes(GetType(DescriptionAttribute), False), DescriptionAttribute()) 

      description(i) = If(attributes.Length > 0, attributes(0).Description, entries(i).Trim()) 
     Next 

     Return String.Join(", ", description) 

    End Function 

    <Extension()> _ 
    Public Function ToListFirstTry(ByVal en As System.Enum) As IEnumerable 

     Dim type As Type = en.GetType 

     Dim items = From item In System.Enum.GetValues(type) _ 
      Select New With {.Value = item, .Text = item.ToDescriptionString} 

     Return items 

    End Function 

    <Extension()> _ 
    Public Function ToListSecondTry(ByVal en As System.Enum) As IEnumerable 

     Dim list As New Dictionary(Of Integer, String) 
     Dim enumValues As Array = System.Enum.GetValues(en.GetType) 

     For Each value In enumValues 
      list.Add(value, value.ToDescriptionString) 
     Next 

     Return list 

    End Function 

Так что моя проблема в том, как методы расширения не работают, что хорошо вместе. Методы, которые преобразуют параметры перечисления в ienumerable, не могут использовать метод расширения для получения описания.

Я нашел все примеры, чтобы сделать одно из них, но никогда в сочетании друг с другом. Что я делаю не так? Я все еще новичок в этих новых материалах .NET 3.5.

ответ

2

Проблема в том, что Enum.GetValues просто возвращает слабо типизированный Array.

Попробуйте это:

Public Function ToListFirstTry(ByVal en As System.Enum) As IEnumerable 

    Dim type As Type = en.GetType 

    Dim items = From item In System.Enum.GetValues(type).Cast(Of Enum)() _ 
     Select New With {.Value = item, .Text = item.ToDescriptionString} 

    Return items 

End Function 

(Это выглядит как явно типизированных переменных диапазона в VB запросов не означает то же самое, как и в C#.)

+0

Я попытался сделать это, но тогда я получаю эту ошибку : «Option Strict On» запрещает неявные преобразования из «Object» в «System.Enum». » на части «As Enum». –

+0

Хорошо, исправление ... –

Смежные вопросы