Cómo crear una lista de F# desde una interfaz para ser consumida por C#/WPF
soy un novato Dado que cada uno de estos representa diferentes clases en C#:
- Detalles de contacto
- Internet
- Números de teléfono
- direcciones
¿Cómo se crea una "lista" en F # para contener los diferentes tipos concretos?
Todos los tipos anteriores tendrán un campo común de:
- Nombre -- cadena
Fuera del nombre, todos los tipos concretos tendrán campos y contenidos diferentes.
Este tipo de "lista" debe ser consumido por WFP/XAML.
(Creo que se necesita usar una interfaz para la lista de F#, pero no sé cómo se implementa; F# es realmente nuevo para mí. :)
AIT
Respuestas
Considere usar Seq en lugar de List para ayudar a los clientes de C#:
Recomendaría usar una secuencia (es decir, secuencia) en lugar de una lista para el consumo de C#. Por lo tanto, una secuencia en F# equivale a IEnumerable en C#. Por lo tanto, podrá usar estos elementos desde su aplicación de Windows.
Así es como implementaría el requisito:
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
]
Disculpe, ¿es esto lo que quiere?
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");
}
}
}
}