2011-02-16 138 views
3

我使用了一招回匿名类型,但是,我不能肯定是否会在所有情况下 工作。如果使用这一招的任何问题PLZ让我知道 所以,我不会在我的项目返回匿名类型

class A 
{ 
    public int ID { get; set; } 
    public string Name { get; set; } 
} 

class B 
{ 
    public int AID { get; set; } 
    public string Address { get; set; } 
} 

private List<object> GetJoin() 
{ 
    var query = from a in objA 
       join b in objB 
       on a.ID equals b.AID 
       select new { a.ID, a.Name, b.Address }; 
    List<object> lst = new List<object>(); 
    foreach (var item in query) 
    { 
     object obj = new { ID = item.ID, Name = item.Name, Address = item.Address }; 
     lst.Add(obj); 
    } 
    return lst; 
} 
T Cast<T>(object obj, T type) 
{ 
    return (T)obj; 
} 

//call Anonymous Type function 
foreach (var o in GetJoin()) 
{ 
    var typed = Cast(o, new { ID = 0, Name = "", Address = "" }); 
    int i = 0; 
} 
+2

最大的问题是:为什么不创建一个名义类型,并完全放弃这些恶作剧? `class NameAndAddress {public int ID {get;组; } public string Name {get;组; } public string Address {get;组; }}。问题解决了。 – 2011-02-16 11:39:24

+0

Becoz为每一个linq查询我不想创建一个类 – Tuscan 2011-02-16 11:44:01

回答

11

是的,有保证的,只要一切都在同一组件内的工作使用此代码。如果你过大会边界,它虽然不会工作 - 匿名类型是内部的,而“身份”的依据是:

  • 大会它在
  • 属性被用于:
    • 名称
    • 类型
    • 订购

一切必须是正确的类型被认为是相同的。

这不是不错虽然。一方面,你的GetJoin方法可以简化为:

return (from a in objA 
     join b in objB 
     on a.ID equals b.AID 
     select (object) new { a.ID, a.Name, b.Address }) 
     .ToList(); 

...和另一个,你已经失去了编译时类型的安全性和可读性。

我认为创建一个真实类型来封装这些数据会更好。诚然,这将是可爱的,如果我们可以创建一个名为类型这是相当于匿名类型,只是一个名字......但那是不可用的时刻:(

0

,而不使用对象类型,就不能返回匿名类型。而使用对象类型,你失去的成员访问

你有两个选择:。

  • 创建一个类型(推荐)
  • 使用动态类型访问成员