将对象转换为匿名类型的IEnumerable

时间:2017-05-05 18:33:31

标签: c# linq system.reactive anonymous-types

如何迭代作为anonymous type下面的对象传入的(first, second, third) => new { One = first, Two = second, Three = third }

如果我询问消息类型并打印消息,则会显示:<>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                
);

3 个答案:

答案 0 :(得分: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                
);

答案 1 :(得分: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);
}

答案 2 :(得分:0)

匿名类型并不意味着传递,因为我们在C#中强烈输入的原因相同:编译器不会出现粗心错误或忘记事情,而且我们经常这样做。如果您的匿名类实例离开创建它们的范围,那么它们就应该成长为一个真正的类。

通常我会说你应该写一个具有适当属性的quickie类(在这里猜测属性类型):

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就像Vise-Grip:“自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}");
    }
}

好的,Vise-Grip也不是总是错误的工具。但是很少有更好的。