2017-05-05 167 views
0

如何遍歷如果我詢問消息的類型和打印傳遞在如下(first, second, third) => new { One = first, Two = second, Three = third }轉換對象匿名類型

對象的anonymous type的IEnumerable的,它說:<>f__AnonymousType0 3[MtApi.MtQuote,MtApi.MtQuote,MtApi.MtQuote]

//**How do I convert an object to the anonymous type?** 
static void ShowAnonymousTypeMessage(object message) 
{  

    foreach(var quote in message) 
    Console.WriteLine(
     quote.Instrument + ": " + quote.Bid.ToString() + quote.Ask.ToString()); 
} 

...

var pattern = observable1.And(observable2).And(observable3); 
var plan = pattern.Then((first, second, third) => new { One = first, Two = second, Three = third }); 
var zippedSequence = Observable.When(plan); 
zippedSequence.Subscribe(
    ShowAnonymousTypeMessage     
); 
+0

你可以設置一個斷點和詢問模式來查看它是什麼類型,並且它是否實現IEnumerable? –

+0

在C#<= 6中,你可以用'dynamic'來做到這一點,但這實際上並不是匿名類型的意思,而'dynamic'並不意味着將C#轉換爲JavaScript。如果你將它傳遞給一個方法,它應該有一個真正的類型。即使是一個Tuple也會是一些東西。 –

+0

@ kevin查看原文 – Ivan

回答

0

這是爲我工作:

static void Main() 
{ 
    var anon = new { Name = "Terry", Age = 34 }; 
    test(anon); 
} 

static void test(dynamic t) 
{ 
    Console.WriteLine(t.Age); 
    Console.WriteLine(t.Name); 
} 
+0

如果你有幾個不只是一個呢? – Ivan

+1

@Ivan'void Test(dynamic d){foreach(d中的動態項){/ * stuff * /}' - 已測試,正常工作。 –

+0

啊哈!謝謝,那就是我所缺少的。 – Ivan

1

匿名類型不打算被傳來傳去,你應該只在絕對必要時使用的對象。你也不能迭代匿名類型 - 你應該使用Array

var pattern = observable1.And(observable2).And(observable3); 
var plan = pattern.Then((first, second, third) => new[] { first, second, third }); 
var zippedSequence = Observable.When(plan); 
zippedSequence.Subscribe(
    ShowAnonymousTypeMessage     
); 
0

匿名類型是註定不會被傳來傳去,出於同樣的原因,我們有強大的類型在C#中的所有:編譯器不會使不小心的錯誤或忘記的事情,我們經常這樣做。如果你的匿名類實例正在離開它們創建的範圍,那麼他們應該成長併成爲一個真正的類。

通常我會說你應該寫有適當的屬性(在屬性類型這裏猜測)匆匆類:

public class Thing { 
    public String One { get; set; } 
    public String Two { get; set; } 
    public String Three { get; set; } 
} 

但是,Tuple<T1,T2,T3>一樣好真的,如果你有屬性名稱像OneTwo,並Three反正:

public static void Main() 
{ 
    var x = Enumerable.Range(0, 10).Select(n => new Tuple<int, string>(n, $"Item {n + 1}")); 

    Test(x); 
} 

private static void Test(IEnumerable<Tuple<int, string>> stuff) 
{ 
    foreach (var item in stuff) 
    { 
     Console.Write($"{item.Item1}: {item.Item2}"); 
    } 
} 

dynamic作品,但dynamic就像虎鉗握: 「總是錯誤的工具對於每一個工作,自1921年以來」。 dynamic在類型系統中具有合法但很小的作用。它不在那裏,所以我們可以把整個語言變成JavaScript。

public static Main() 
{ 
    var x = Enumerable.Range(0, 10).Select(n => new { ID = n, Value = $"Item {n + 1}" }); 

    Test(x); 
} 

private static void Test(dynamic message) 
{ 
    foreach (dynamic item in message) 
    { 
     Console.Write($"{item.ID}: {item.Value}"); 
    } 
} 

確定,虎鉗握不總是錯誤的工具無論是。但很少有沒有更好的。