2013-06-07 13 views
5

nesne, ben döngü için basit bir nesnenin her özelliğe erişebilir. Ben bir XML dosyası jeneratör üzerinde çalışıyorum
böyle şeyi yapmak istiyorum neden javascript olarak

type MyObj = {x:int; y:int} 
let myObj = {x=1; y=2} 
let allValues:seq<int> = allPropertyValuesIn myObj //How do I implement allPropertyValuesIn 
let sum = allValues |> Seq.fold (+) 0 

netleştirmek için girişiniz için

Edit teşekkür ederiz. Giriş, Veritabanından okunan satırlardır ve xsd önceden tanımlanmıştır.

"Ürün" Öğesinin oluşturulmasını ve iş kurallarına bağlı olarak 200 tane Çocuk öğesi gerekebilir, bazılarının isteğe bağlı olması gerekir.

1. type Product{ Price:Money; Name:Name; FactoryLocation:Address option ... } 
2. let product = {Price = Money(1.5); Name = Name ("Joe Tooth Paste"); ... } 
3. let child1 = createEl ("Price", product.Price) 
    .. 
203. let allChildren = child1 
         ::child2 
         ::child3 
         .. 
         ::[] 
404. let prodctEl = createElWithCildren ("Product", allChildren) 

Bu çok sıkıcı ve un-özlü geçerli: this excellent blog tavsiye izleyerek ben ürün kayıt için benim ilk (çok kaba) tasarımı oldu. F # içinde böyle bir şey yapmanın daha iyi bir yolu olmalı. Ben de yansıma fikrinde çok kin değilim.

Başka herhangi bir yaklaşım var mı yoksa yanlış mı yapıyorum?

+2

Bu yansıma ile mümkündür, ancak hızlı, güvenli tipte bir alternatif olduğunu düşünmüyorum. –

+0

"Nedenini açıklığa kavuşturmak için ..." probleminiz çok değişti: Eğer childs yapısını otomatikleştirmek istiyorsanız, childs yapınızı (200 childs yapınız) NORMALIZE yapmalısınız. – josejuan

cevap

5

bu deneyin: John Palmer admonishes olarak

open Microsoft.FSharp.Reflection 

type MyObj = {x:int; y:int} 
let myObj = {x=1; y=2} 
let allValues = FSharpType.GetRecordFields (myObj.GetType()) 
let sum = 
    allValues 
    |> Seq.fold 
     (fun s t -> s + int(t.GetValue(myObj).ToString())) 
     0 
printfn "%d" sum 

Ancak, böyle bir şey yapmak için çok sayıda iyi neden yoktur.

+2

Bu, bu iyi nedenlerden biri olsa da. Bir harita gibi bir yapının/kaydının işlenmesi (bir yapının gerçekte olduğu veri yapısı), yazım denetleyicinizden en iyi şekilde yararlanabilmek için genel arabirimlerde yararlıdır. Tüm olası parametreleri bir web API'sine (uygun olduğunda Seçenek türleri dahil) göstermek için bir kayıt kullanabilirsiniz. Ardından sahnelerin arkasında, http yükünü oluşturmak için üye isimleriyle ilgili bir duvar yazmak yerine bunun gibi bir şey yapın. İsim-duvarı yaklaşımı, özellikle bakım için kötüdür. – Cogwheel

İlgili konular