我正在使用一种技巧来返回匿名类型但是,我不确定它是否会 在所有情况下工作。如果使用这个技巧有任何问题请告诉我 所以我不会在我的项目中使用这段代码
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;
}
答案 0 :(得分:11)
是的,只要一切都在同一个程序集中,就可以保证工作正常。如果你越过程序集边界,它将无法工作 - 匿名类型是内部的,“身份”基于:
Everything 必须恰到好处才能将类型视为相同。
但它不是很好。首先,您的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();
...而另一方面,你失去了编译时类型的安全性和可读性。
我认为你创建一个真正的类型来封装这些数据要好得多。不可否认,如果我们可以创建一个等同于匿名类型的命名类型,只需要一个名字就可以了......但是目前还没有这个类型:(
答案 1 :(得分:0)
如果不使用对象类型,则无法返回匿名类型。使用对象类型,您将失去成员访问权限。
您有两种选择: