#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()