如何迭代作为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
);
答案 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>
,One
和Two
等属性名称,那么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也不是总是错误的工具。但是很少有更好的。