Доступ к типу "свойства" в C # - PullRequest
0 голосов
/ 05 марта 2019

Я использую ROP (Railway Oriented Programming), моделирую его после swlaschin в оболочке SQLite:

И я возвращаю RopResult типы:

type RopResult<'TSuccess, 'TMessage> =
    | Success of 'TSuccess * 'TMessage list
    | Failure of 'TMessage list

И все хорошо работает в F # по составу, но мне все еще нужно взаимодействовать с C # иногда и при возврате RopResult все разваливается.то есть:

RopResult<seq 't, DomainMessage>

Как я могу получить доступ к этим "свойствам" (то есть неисчислимым C #), не прибегая к приведению его к типу dynamic:

var ropResult = dao.All; //  RopResult<seq 't, DomainMessage>
var dyn = ropResult as dynamic;
foreach (SomeClass item in dyn.Item1)
{
    Console.WriteLine(item.Id);
}

1 Ответ

0 голосов
/ 05 марта 2019

Вы можете просто привести к соответствующему подтипу или использовать сопоставление с образцом (в C # 7.0 или более поздней версии):

switch (result)
{
    case RopResult<IEnumerable<T>, DomainMessage>.Success success:
        var value = success.Item1;
        var messages = success.Item2;
        // do something
        break;
    case RopResult<IEnumerable<T>, DomainMessage>.Failure failure:
        var errors = failure.Item;
        // do something else
        break;
    default:
        throw new ArgumentOutOfRangeException();
}    

Однако это не идеальный API из C #.Вы можете написать несколько методов расширения, чтобы помочь с этим.Вы можете получить вдохновение от Chessie .

...