Приложение C # .Net WinForms: анонимная коллекция — как кастовать возвращаемый тип

#c# #.net #winforms #casting #anonymous-types

#c# #.net #winforms #Кастинг #анонимные типы

Вопрос:

Похоже, что для меня это проблема с регистрацией. У меня снова возникает проблема с типом приведения, когда я использую анонимную коллекцию. Мой запрос из XML-файла возвращает коллекцию строковых значений. Я пытаюсь вернуть эти значения с моего уровня доступа к данным на мой уровень бизнес-логики. Заранее спасибо.

     public string[] getCustDetails(string customerId)
    {
        //Pulls customer information for selected customer
        var doc = XDocument.Load("Portfolio.xml");
        var custRecord = from account in doc.Descendants("acct")
                         let acct = account.Element("acct")
                         where (string)account.Attribute("custid").Value == customerId
                         select new
                         {
                             Fname = (string)account.Attribute("fname").Value,
                             Lname = (string)account.Attribute("lname").Value,
                             Ssn = (string)account.Attribute("ssn").Value,
                             Dob = (string)account.Attribute("dob").Value,
                             Custid = (string)account.Attribute("custid").Value
                         };
return ?????

    }
  

Комментарии:

1. Как будет выглядеть этот возвращаемый массив? Мне непонятно, как вы планируете представлять свой анонимный составной объект в виде массива строк.

Ответ №1:

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

Я предлагаю создать простой класс с нужными вам свойствами и использовать его вместо анонимного типа.

 public class AccountDetails
{
  public string FName { get; set; }
  public string LName { get; set; }
  public string Ssn { get; set; }
  public string Dob { get; set; }
  public string Custid { get; set; }
}

public IEnumerable<AccountDetails> getCustDetails(string customerId)
{
    //Pulls customer information for selected customer
    var doc = XDocument.Load("Portfolio.xml");
    var custRecords = from account in doc.Descendants("acct")
                     let acct = account.Element("acct")
                     where (string)account.Attribute("custid").Value == customerId
                     select new AccountDetails
                     {
                         Fname = (string)account.Attribute("fname").Value,
                         Lname = (string)account.Attribute("lname").Value,
                         Ssn = (string)account.Attribute("ssn").Value,
                         Dob = (string)account.Attribute("dob").Value,
                         Custid = (string)account.Attribute("custid").Value
                     };

    return custRecords;
}
  

Комментарии:

1. Как мне ввести коллекцию, которая возвращается в мой layeer бизнес-логики (DLGetCustomers obj = new DLGetCustomers();)?? Некоторый тип коллекции должен быть равен: obj. GetCustDetails

2. Извините, я действительно борюсь с этими общими коллекциями.

3. @Susan — Поскольку я не знаю, какого типа вы ожидаете взамен, я действительно не могу помочь. Вы можете использовать список предлагаемого AccountDetails класса.

Ответ №2:

создайте новый класс для требования и верните его в виде списка…

     public MyClass[] getCustDetails(string customerId)
    {
        //Pulls customer information for selected customer
        var doc = XDocument.Load("Portfolio.xml");
        var custRecord = (from account in doc.Descendants("acct")
                         let acct = account.Element("acct")
                         where (string)account.Attribute("custid").Value == customerId
                         select new MyClass
                         {
                             Fname = (string)account.Attribute("fname").Value,
                             Lname = (string)account.Attribute("lname").Value,
                             Ssn = (string)account.Attribute("ssn").Value,
                             Dob = (string)account.Attribute("dob").Value,
                             Custid = (string)account.Attribute("custid").Value
                         }).ToArray();
   return custRecord;

    }
  

определите свой класс как

 public class MyClass
{
    public string Fname  { get; set; }
    public string Lname { get; set; }
    public string Ssn { get; set; }
    public string Dob { get; set; }
    public string Custid { get; set; }
}
  

Ответ №3:

Я бы создал новый класс, содержащий следующие свойства.

  string Fname
 string Lname
 string Ssn
 string Dob
 string Custid
  

Затем верните этот тип из вашего метода getCustDetails()