2010-04-14 85 views
1

最近有人问我要证明的C#3.0的功率在单行(可能是棘手)C#-Interview问题匿名类型

我写

new int[] { 1, 2, 3 }.Union(new int[]{10,23,45}). 
ToList().ForEach(x => Console.WriteLine(x)); 

,并解释你可以有(I)匿名数组(ii)扩展方法(iii)lambda和关闭全部在一行中。我得到了现货供应。

但是.....

面试官问我how will you convert an anonymous type into known type :(

我解释

public class Product 
{ 
    public double ItemPrice { private set; get; } 
    public string ItemName { private set; get; } 
} 


var anony=new {ItemName="xxxx",ItemPrice=123.56}; 

您不能分配​​

面试官回答说有200%的几率要做到这一点 如果你有一个小小的工作。我无能为力。

和往常一样,我在等待您的宝贵回复(有可能吗?)。

+0

我知道这** **破解并不会连考虑把它展示给任何人。 – ChaosPandion 2010-04-14 19:45:37

+0

在这个例子中我看不到闭包:-) – 2010-04-15 04:23:28

回答

0

也许是这样的:

class Program 
{ 
    static T Cast<T>(object target, T example) 
    { 
     return (T)target; 
    } 

    static object GetAnon() 
    { 
     return new { Id = 5 }; 
    } 

    static void Main() 
    { 
     object anon = GetAnon(); 
     var p = Cast(anon, new { Id = 0 }); 
     Console.WriteLine(p.Id); 
    } 
} 

备注:从未写或依赖于这样的代码。

+0

不,我认为这不会起作用。虽然两个匿名类型具有相同的结构,但它们仍然是不同的类型。 – 2010-09-23 17:01:47

+1

@只是万一,你真的测试过这个例子吗,还是假设你是从头顶上看的东西?这两个将与编译器生成并重新使用的类型完全相同。你认为如果那些是两种不同的类型,演员将是可能的?你知道如何在.NET中进行投射吗?你是否用反射器打开了生成的程序集,并且实际分析了生成的单一类型?从你的评论看来,所有这些问题的答案都是消极的。 – 2010-09-23 17:06:27

0
var list = anony.Select(x=> new Product { 
       ItemPrice = x.ItemPrice, ItemName = x.ItemName }).ToList();