Как возвратить анонимный тип из c# метода, который использует LINQ для SQL [дубликат]

Это походит IllegalArgumentException, требуется, если бы Вы не хотите null быть позволенным значением, и эти NullPointerException был бы брошен, если бы Вы пробовали к использование переменная, которая оказывается null.

44
задан Community 23 May 2017 в 11:54
поделиться

6 ответов

Сделайте анонимный тип в класс ...

public class Person
{
    public Person() {
    }

    public String Name { get; set; }
    public DateTime DOB { get; set; }
}


Person p = 
    from person in db.People 
    where person.Id = 1 
    select new Person { 
        Name = person.Name,
        DOB = person.DateOfBirth
    }
65
ответ дан 26 November 2019 в 21:57
поделиться

Использование var не делает его анонимным. Использование var означает, что эта переменная должна иметь тип, доступный в правой части присваивания. Это просто короткая рука. Если объект справа - реальный класс, переменная будет принадлежать к этому типу.

Например:

var person = new Person { Name = "bob" };

Переменная person имеет тип Person, даже несмотря на то, что в ней использовалось ключевое слово var.

Анонимные типы создаются с использованием нового {Name = ...}. В данном случае это новый анонимный класс. Единственное, чему вы можете присвоить его, это переменная, определенная с помощью var (или object), поскольку имя для использования не существует.

Например:

var person = new { Name = "bob" };

В этом случае person - это анонимный тип, определенный во время выполнения.

Обычно, как говорит @Chalkey, если вы хотите передать результат обратно в другой метод, используйте именованный тип, а не анонимный.

6
ответ дан 26 November 2019 в 21:57
поделиться

Вы не можете ввести какой-либо метод в C # как явный тип анонимных типов. Они не могут быть, так сказать, "названы" и, следовательно, не могут появляться в сигнатурах метаданных.

Если вы действительно хотите вернуть значение, которое является анонимным типом, есть 2 варианта

  1. Установить тип возвращаемого значения метода System. Объект. Затем вы можете использовать злые хитрости приведения типов, чтобы получить типизированное значение другим методом. Это очень хрупкий, и я не рекомендую его.
  2. Используйте общий метод и уловку вывода типа, чтобы получить правильный тип возвращаемого значения. Это потребует очень интересного определения сигнатуры для вашего подхода.

Анонимные типы на самом деле не предназначались для передачи таким образом. В тот момент, когда вам нужно передать их между вашими функциями таким образом, вам лучше явно определить тип.

19
ответ дан 26 November 2019 в 21:57
поделиться

Джон Скит написал блог о том, как это сделать, вполне справедливо названный Horribly Grotty Hack . Как следует из названия, вам действительно не следует искать способы вернуть анонимный тип. Вместо этого вы должны создать тип, который может быть возвращен, поскольку это правильный способ реализации этой функции.

Поэтому я рекомендую вам создать конкретное определение типа, который будет возвращен, а затем заполнить его в своем запросе для него. подлежит возврату.

5
ответ дан 26 November 2019 в 21:57
поделиться

Это отчасти зависит от того, как вызывающий код будет использовать данные.

Если вы выполняете простую привязку данных, вас действительно не волнует тип (т.е. 'не нужно явно обращаться к свойствам в вашем коде C #), вы можете передать результаты обратно как IEnumberable.

В большинстве случаев привязки данных вы в любом случае вызываете свойства по имени, через магические строки, поэтому точный тип не в любом случае имеет значение.

В противном случае вам нужно преобразовать анонимный тип в именованный тип.

2
ответ дан 26 November 2019 в 21:57
поделиться

Если вам нужно передать результаты в большом приложении, вы можете использовать Словарь. Да, у вас есть накладные расходы при забросе, но, по крайней мере, вы уменьшаете количество выбрасываемых предметов.

0
ответ дан 26 November 2019 в 21:57
поделиться
Другие вопросы по тегам:

Похожие вопросы: