Объявление статического списка строк и обращение к ним по именам [дубликат]

Обертка вокруг GNU ld, которая не поддерживает скрипты компоновщика

. Некоторые .so-файлы на самом деле являются GNU ld ссылками-компоновщиками , например. Файл libtbb.so является текстовым файлом ASCII с этим содержимым:

INPUT (libtbb.so.2)

Некоторые более сложные сборки могут не поддерживать это. Например, если вы включаете -v в параметры компилятора, вы можете видеть, что mainwin gcc wrapper mwdip отбрасывает файлы команд сценария компоновщика в подробном списке результатов библиотек для ссылки. Простая работа вместо файла командной строки ввода сценария компоновщика вместо копии (или символической ссылки), например

cp libtbb.so.2 libtbb.so

Или вы можете заменить аргумент -l полным путем .so, например вместо -ltbb сделать /home/foo/tbb-4.3/linux/lib/intel64/gcc4.4/libtbb.so.2

23
задан Brijesh Patel 13 September 2013 в 07:44
поделиться

6 ответов

Вы можете просто создать новый тип

''' <completionlist cref="Test"/>
Class Test

    Private Key As String

    Public Shared ReadOnly Contact  As Test = New Test("Personal Contanct")
    Public Shared ReadOnly PersonalInfo As Test = New Test("Personal Info")

    Private Sub New(key as String)
        Me.Key = key
    End Sub

    Public Overrides Function ToString() As String
        Return Me.Key
    End Function
End Class

, и, когда вы его используете, он выглядит как выглядит как [en]:

Sub Main

    DoSomething(Test.Contact)
    DoSomething(Test.PersonalInfo)

End Sub

Sub DoSomething(test As Test)
    Console.WriteLine(test.ToString())
End Sub

output:

Персональная персональная информация

19
ответ дан sloth 27 August 2018 в 15:31
поделиться

Как насчет использования меток. Что-то вроде:

Public Enum MyEnum
<StringValue("Personal Contact")>Contact
<StringValue("My PersonalInfo")>PersonalInfo
End Enum

Вам нужно написать атрибут StringValue как:

Public Class StringValueAttribute
    Inherits Attribute

    Public Property Value As String
    Public Sub New(ByVal val As String)
        Value = val
    End Sub

End Class

Чтобы получить его:

 Public Function GetEnumByStringValueAttribute(value As String, enumType As Type) As Object
    For Each val As [Enum] In [Enum].GetValues(enumType)
        Dim fi As FieldInfo = enumType.GetField(val.ToString())
        Dim attributes As StringValueAttribute() = DirectCast(fi.GetCustomAttributes(GetType(StringValueAttribute), False), StringValueAttribute())
        Dim attr As StringValueAttribute = attributes(0)
        If attr.Value = value Then
            Return val
        End If
    Next
    Throw New ArgumentException("The value '" & value & "' is not supported.")
End Function

Public Function GetEnumByStringValueAttribute(Of YourEnumType)(value As String) As YourEnumType
    Return CType(GetEnumByStringValueAttribute(value, GetType(YourEnumType)), YourEnumType)
End Function

И затем вызов для получения Enum (с использованием строкового атрибута):

Dim mEnum as MyEnum = GetEnumByStringValueAttribute(Of MyEnum)("Personal Contact")

Чтобы получить значение «Атрибут» (удаленное управление «Nothing» для ясности):

  Public Function GetEnumValue(Of YourEnumType)(p As YourEnumType) As String
        Return DirectCast(Attribute.GetCustomAttribute(ForValue(p), GetType(StringValueAttribute)), StringValueAttribute).Value
  End Function

  Private Function ForValue(Of YourEnumType)(p As YourEnumType) As MemberInfo
        Return GetType(YourEnumType).GetField([Enum].GetName(GetType(YourEnumType), p))
  End Function

И вызов для получения строкового атрибута (с использованием Enum):

Dim strValue as String = GetEnumValue(Of MyEnum)(MyEnum.Contact)
6
ответ дан Denis 27 August 2018 в 15:31
поделиться

Как я могу получить это значение с помощью ENUM? или любой другой способ сделать это.

Существует три общих способа сопоставления значений перечисления для строк:

  • Используйте Dictionary(Of YourEnumType, String)
  • Украсить значения перечисления атрибутами (например, DescriptionAttribute) и получить их с отражением
  • Использовать оператор Switch

. Первый из этих вариантов, вероятно, на мой взгляд.

5
ответ дан Jon Skeet 27 August 2018 в 15:31
поделиться

Я знаю, что это старый пост, я нашел хорошее решение, которое стоит использовать:

''' <summary>
''' Gives acces to strings paths that are used often in the application
''' </summary>
Public NotInheritable Class Link        
    Public Const lrAutoSpeed As String          = "scVirtualMaster<.lrAutoSpeed>"
    Public Const eSimpleStatus As String        = "scMachineControl<.eSimpleStatus>"
    Public Const xLivebitHMI As String          = "scMachineControl<.xLivebitHMI>"      
    Public Const xChangeCycleActive As String   = "scMachineControl<.xChangeCycleActive>"

End Class

Использование:

'Can be anywhere in you applicaiton:
Link.xChangeCycleActive

Это предотвращает нежелательное дополнительное кодирование, это легко для поддержки, и я думаю, что это минимизирует дополнительные накладные расходы процессора.

Также визуальная студия отображает строковые атрибуты сразу после того, как вы наберете «Ссылка», как если бы она была обычной Enum

3
ответ дан Rob Heijligers 27 August 2018 в 15:31
поделиться

Для нецелых значений вместо Structure (или Class) можно использовать Const:

Structure Test
    Const PersonalInfo = "Personal Info"
    Const Contanct = "Personal Contanct"
End Structure

или в Module для прямого доступа без Test. part:

Module Test
    Public Const PersonalInfo = "Personal Info"
    Public Const Contanct = "Personal Contanct"
End Module

В некоторых случаях имя переменной может использоваться как значение:

Enum Test
    Personal_Info
    Personal_Contanct
End Enum

Dim PersonalInfo As String = Test.Personal_Info.ToString.Replace("_"c, " "c)

' or in Visual Studio 2015 and newer:
Dim Contanct As String = NameOf(Test.Personal_Contanct).Replace("_"c, " "c)
38
ответ дан Slai 27 August 2018 в 15:31
поделиться

Если все, что вы хотите сделать, это отобразить перечисления в списке или комбо, вы можете использовать тегировку, например

Private Enum MyEnum
    Select_an_option___
    __ACCOUNTS__
    Invoices0
    Review_Invoice
    __MEETINGS__
    Scheduled_Meetings0
    Open_Meeting
    Cancelled_Meetings0
    Current_Meetings0
End Enum

Затем потяните MyEnum в строку и используйте Replace ( или Regex), чтобы заменить теги: «___» на «...», «__» с «**», «_» на «» и удалить конечные числа. Затем переупакуйте его в массив и выгрузите в выпадающий список, который будет выглядеть так:

Select an option...
**ACCOUNTS**
Invoices
Review Invoice
**MEETINGS**
Scheduled Meetings
Open Meeting
Cancelled Meetings
Current Meetings

(Вы можете использовать номера, чтобы, скажем, отключить текстовое поле для ввода номера счета или комнаты для переговоров В этом примере Review Invoice и Open Meeting могут ожидать дополнительный вход, поэтому для этих вариантов может быть включено текстовое поле.)

При анализе выбранного комбинированного элемента перечисление будет работать как ожидалось но вам действительно нужно добавить одну строку кода - замену текста - чтобы получить комбо, чтобы выглядеть так, как вы пожелаете.

(Объяснение примерно в 10 раз связано с фактическим решением!)

1
ответ дан SteveCinq 27 August 2018 в 15:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: