任何人都可以提供帮助。我有以下作为LINQ的一部分,它的工作,但对象MyObject返回一个匿名类型。 (我在调试模式下检查了它)
{System.Linq.Enumerable.WhereSelectEnumerableIterator<<>f__AnonymousType1<MyType.ParamRow,MyType.Row>,object>}
以下是我的查询的一部分
select new Param
{
Name ="Test1",
MyObject = (from o1 in otherObject.Object join o2 in otherObject.ObjectB on
o1.Id equals o2.Id
where o.Id == o2.Id select this.BuildMyObject("DataObject", o1))
}
我想我正在使用选择错误....
基本上MyObject返回对象的类型,但是这个
select this.BuildMyObject("DataObject", o1)
返回匿名类型。我想创建一个真实类型的对象..
我认为我做错了。
修改
构建我的对象非常简单,目前我正在返回一个TextBox(文本框是我的一个类),因为你可以看到它返回OBJECT
private object BuildMyObject(string type, TestStructure.ParamRow item)
{
MyTextBox control = new MyTextBox();
control.Name = "NotEmpty";
return control
}
答案 0 :(得分:1)
这就是编译器实现连接的方式;它创建一个代表各种形式的匿名类型。您应该能够在选择中修复此问题,例如:
select Tuple.Create(o1, o2);
或者如果您只需要o1
:
select o1;
答案 1 :(得分:1)
查看您的MyObject,我相信您在这里看到的是支持IEnumerable<object>
的具体类型。这是因为您不限于单个对象。如果您希望有一行,请告诉它:
select new Param
{
Name ="Test1",
MyObject = (from o1 in otherObject.Object
join o2 in otherObject.ObjectB on o1.Id equals o2.Id
where o.Id == o2.Id select this.BuildMyObject("DataObject", o1)
).First()
}
否则,只需访问MyObject
作为IEnumerable<object>
,您就会发现每一行实际上都是MyTextBox
;即。
var sequence = (IEnumerable<object>) param.MyObject;
foreach(MyTextBox tb in sequence) {
// should work
}
但请注意,这与IEnumerable<MyTetxBox>
不同;为此,您将使用.Cast<MyTextBox>()