2017-05-05 128 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}"); 
    } 
} 

确定,虎钳握不总是错误的工具无论是。但很少有没有更好的。