Мне определили перечисляемый тип как так:
type tags =
| ART = 0
| N = 1
| V = 2
| P = 3
| NULL = 4
есть ли способ сделать a for ... in tags do
?
Это - ошибка, которую я получаю:
Значение, конструктор, пространство имен или тип
tags
не определяется
Используйте Enum.GetValues
:
let allTags = Enum.GetValues(typeof<tags>)
Чтобы сделать его enum, вам нужно явно дать значения каждому случаю, в противном случае это профсоюзный тип:
type tags =
| ART = 0
| N = 1
| V = 2
| P = 3
| NULL= 4
let allTags = System.Enum.GetValues(typeof<tags>)
Вот полный пример, который выводит информацию о любом размеченном объединении. Он показывает, как получить случаи размеченного объединения, а также как получить поля (в случае, если они вам нужны). Функция печатает объявление типа данного дискриминированного объединения:
open System
open Microsoft.FSharp.Reflection
let printUnionInfo (typ:Type) =
printfn "type %s =" typ.Name
// For all discriminated union cases
for case in FSharpType.GetUnionCases(typ) do
printf " | %s" case.Name
let flds = case.GetFields()
// If there are any fields, print field infos
if flds.Length > 0 then
// Concatenate names of types of the fields
let args = String.concat " * " [ for fld in flds -> fld.PropertyType.Name ]
printf " of %s" args
printfn ""
// Example
printUnionInfo(typeof<option<int>>)
Вы, конечно, можете изменить сообщения журнала задним числом, это рассматривается в часто задаваемых вопросах . Я не уверен, как работает интерфейс командной строки для StartSVN, но для vanilla svn команда будет
svn propset -r N --revprop svn:log "new log message" URL
Если вы хотите сделать это для всех редакций без выгрузки репозитория и повторной загрузки, вы можете создать сценарий этой команды для работы со списком всех редакций. Для выполнения этого пути потребуется некоторое время, в зависимости от размера репозитория, но в принципе нет причин, по которым вы не можете это сделать, и это не требует дампа и перезагрузки.
Кроме того, vanilla SVN имеет команду svnlook
, которая представляет собой средство администрирования, работающее непосредственно с файлами репозитория. Этот инструмент не понимает URL (вы должны иметь доступ на уровне файловой системы к репозиторию), но намного быстрее. Синтаксис немного отличается, но свойства можно изменить таким же образом, используя этот инструмент.
Одним из примеров API высокого (er) уровня в BouncyCastle может быть пакет CMS ( Синтаксис криптографических сообщений ). Это поставляется в отдельной банке (bcmail) от самого провайдера, и записывается в JCE (версия C # написана против облегченного API, однако).
«Send a confidential message» реализуется, грубо говоря, классом CMSEnvableedDataGenerator, и все, что вам действительно нужно сделать, это дать ему сообщение, выбрать алгоритм шифрования (все детали обрабатываются внутри), а затем указать один или несколько способов, которыми получатель сможет прочитать сообщение: это может быть основано на открытом ключе/сертификате, общем секрете, пароле или даже протоколе соглашения о ключе. В сообщении может быть несколько получателей, а также можно смешивать и сопоставлять типы получателей.
Можно использовать CMSSignedDataGenerator для аналогичной отправки проверяемого сообщения. Если вы хотите подписать и зашифровать, структуры CMS являются вложенными/составными (но порядок может быть важным). Существует также генератор данных CMSCompedDataGenerator и недавно добавленный CMSAuthenticureData.
-121--1428388- Право Роберта на создание фактического перечисления и получение его вариантов. При наличии истинного типа объединения обращения можно получить с помощью функции Microsoft.FSharp.Reflection.FSharpType.GetUnionCases
.