3

我正在使用一种技巧来返回匿名类型,但我不确定它是否适用于所有场景。如果使用这个技巧有任何问题请告诉我,这样我就不会在我的项目中使用这个代码

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;
}
4

2 回答 2

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();

...另一方面,您失去了编译时类型的安全性和可读性。

我认为您最好创建一个真实类型来封装这些数据。诚然,如果我们可以创建一个与匿名类型等效的命名类型,只需要一个名称......但这将是很可爱的......但目前不可用:(

于 2011-02-16T11:41:16.513 回答
0

不使用 Object 类型就不能返回匿名类型。并且使用对象类型,您将失去成员访问权限。

你有两个选择:

  • 创建一个类型。(推荐的)
  • 使用动态类型访问成员
于 2011-02-16T11:42:46.453 回答