Как создать список F # из интерфейса, который будет использоваться C # / WPF

#f#

#f#

Вопрос:

Я новичок. Учитывая, что каждый из них представляет разные классы в C#:

  1. ContactDetails
  2. Интернет
  3. Номера телефонов
  4. Адреса

Как создается «список» в F # для хранения различных конкретных типов?

Все вышеупомянутые типы будут иметь общее поле:

  1. Name — строка

За пределами имени все конкретные типы будут иметь разные поля и содержимое.

Этот тип «списка» должен использоваться WFP / XAML.

(Я думаю, что необходимо использовать интерфейс для списка F #, но я не знаю, как это реализовано — F # действительно действительно новый для меня. 🙂

TIA

Ответ №1:

Рассмотрите возможность использования Seq вместо List, чтобы помочь клиентам C #:

Я бы рекомендовал использовать последовательность (т. Е. seq) вместо списка для использования C #. Следовательно, последовательность в F # приравнивается к IEnumerable в C #. Таким образом, вы сможете использовать эти элементы из своего приложения Windows.

Вот как я бы реализовал это требование:

 type ContactDetail = { Name : string; Other:string }
type Internet      = { Name : string; Other:string }
type PhoneNumber   = { Name : string; Other:string }
type Address       = { Name : string; Other:string }

type MyType =
    | ContactDetails of ContactDetail seq
    | Internet       of Internet      seq
    | PhoneNumbers   of PhoneNumber   seq
    | Addresses      of Address       seq

let contactDetail  : ContactDetail = { Name="some name"; Other="???" }
let contactDetails = ContactDetails [contactDetail]

let internet       : Internet = { Name="some name"; Other="???" }
let internets      = Internet [internet]

let phoneNumber    : PhoneNumber = { Name="some name"; Other="???" }
let PhoneNumbers   = PhoneNumbers [phoneNumber]

let myTypes : MyType seq = seq [ contactDetails
                                 internets
                                 PhoneNumbers
                               ]
  

Ответ №2:

Извините, это то, чего вы хотите?

F#

 module FSharpTest.ListTest
open System


type YourType = Object

type ContactDetails = YourType
type Internet = YourType
type PhoneNumbers = YourType
type Addresses = YourType


type WrapperOfCSharpClass =
| CD of ContactDetails
| I of Internet
| PN of PhoneNumbers
| A of Addresses

let list = [
    Unchecked.defaultof<WrapperOfCSharpClass>
    CD (new ContactDetails())
    I (new Internet())
]
  

C#

 using System;
using FSharpTest;
namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            var fsharplist_item = ListTest.list[0];
            if (fsharplist_item.IsPN)
            {
                Console.WriteLine("I am a phone number");
            } else if (fsharplist_item.IsA)
            {
                Console.WriteLine("I am an address");
            }
        }
    }
}