我有一个类,其属性具有私有 Setter。这是一个 ID,我希望它仅在对象创建中设置,并且不可修改。 我所做的 - 是通过在类构造函数中指定来设置它:
public class Customer : CustomerBase
{
public Customer()
{
CustomerId = Utilities.RandomString(6);
}
public Customer(string customerId)
{
CustomerId = customerId;
}
public string CustomerId { get; private set; }
public string CustomerName { get; set; }
}
}
此方法适用于创建(并正确保存在 CSV 文件中(。 但这似乎触发了当我从 CSV 文件读取时重新生成此 ID - 因此当我将保存的 ID 与我在检索/读取期间指定的 ID 进行比较时 - 同一条目比较 2 个不同的 ID。
这是我的读取代码:
public class CustomerRepository
{
public Customer Retrieve(string customerId)
{
List<Customer> records = null;
try
{
using (StreamReader reader =
new StreamReader("DataStoreOut.csv"))
{
using (CsvReader csvReader = new CsvReader(reader))
{
records = csvReader.GetRecords<Customer>().ToList();
}
}
var index = records.FindIndex(x => x.CustomerId.ToLowerInvariant() == customerId.ToLowerInvariant());
return records[index];
}
catch (FileNotFoundException ex)
{
Console.WriteLine(ex);
throw;
}
}
}
程序类:
class Program
{
static void Main(string[] args)
{
var customer = new Customer();
var customerRepository = new CustomerRepository();
Console.WriteLine("Is it new customer (Y/N): ");
answer = Console.ReadLine();
if (answer == "N")
{
Console.WriteLine("Pls enter ID: ");
ID = Console.ReadLine();
customerRepository.Retrieve(ID);
}
else
{
customerRepository.Save(customer);
}
}
}
让此 ID 设置一次且不再可修改(除非删除整行(,但同时不会在每次调用时再次重新生成,这有什么更好的方法?
这是因为当你执行csvReader.GetRecords((时,它本质上调用默认构造函数,它总是创建一个新的随机ID。这永远不会正常工作。
因此,从分配随机 ID 的构造函数中删除代码:
public class Customer : CustomerBase
{
public Customer()
{
// SNIP
}
public Customer(string customerId)
{
CustomerId = customerId;
}
public string CustomerId { get; private set; }
public string CustomerName { get; set; }
}
}
然后第一次仅从调用代码中分配随机 ID。像这样:
class Program
{
static void Main(string[] args)
{
var customer = null;
var customerRepository = new CustomerRepository();
Console.WriteLine("Is it new customer (Y/N): ");
answer = Console.ReadLine();
if (answer == "N")
{
Console.WriteLine("Pls enter ID: ");
ID = Console.ReadLine();
customer = customerRepository.Retrieve(ID);
}
else
{
customer = new Customer(Utilities.RandomString(6)); // Assign random ID
customerRepository.Save(customer);
}
}
}
在不知道您使用哪个库来读取 csv 的情况下,我建议您不要在默认构造函数中分配 ID,然后在创建新客户实例时始终传入 ID。默认构造函数可能应该是私有的,尽管 CSV 库可能不支持这一点。