LINQ:从linq中调用一个方法?,我的方法返回一个匿名类型

时间:2011-04-05 10:53:07

标签: c# linq linq-to-objects anonymous-types

任何人都可以提供帮助。我有以下作为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

    }

2 个答案:

答案 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>()