LINQ: вызов метода из linq ?, мой метод возвращает анонимный тип - PullRequest
3 голосов
/ 05 апреля 2011

Может кто-нибудь помочь. У меня есть следующее как часть 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)

возвращает анонимный тип. Я хочу создать реальный тип объекта ..

Я думаю, что делаю что-то не так.

EDIT

Создать мой объект очень просто, в настоящее время я возвращаю TextBox (текстовое поле - мой класс), как вы можете видеть, он возвращает OBJECT

    private object BuildMyObject(string type, TestStructure.ParamRow item)
    {

        MyTextBox control = new MyTextBox();

        control.Name = "NotEmpty";
        return control

    }

Ответы [ 2 ]

1 голос
/ 05 апреля 2011

Глядя на ваш 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>()

1 голос
/ 05 апреля 2011

Так компилятор реализует соединения; он создает анонимный тип, представляющий различные формы. Вы должны иметь возможность исправить это в выборе, например:

select Tuple.Create(o1, o2);

или если вам нужно только o1:

select o1;
...