Как создать список F # из интерфейса, который будет использоваться C # / WPF
Я новичок. Учитывая, что каждый из них представляет разные классы в C #:
- Контактная информация
- Интернет
- Телефонные номера
- Адреса
Как в F # создается «список» для хранения различных конкретных типов?
Все вышеперечисленные типы будут иметь общее поле:
- Имя - строка
Помимо названия, все конкретные типы будут иметь разные поля и содержимое.
Этот тип «списка» должен использоваться WFP / XAML.
(Я думаю, что нужно использовать интерфейс для списка F #, но я не знаю, как это реализовано - F # для меня действительно новинка. :)
TIA
Ответы
Рассмотрите возможность использования 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
]
Простите, вы этого хотите?
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");
}
}
}
}