我有一些用逗号分隔的文本文件,我想读取一行,然后实例化它并为属性赋值。文本文件的数量将来会增长,但现在,我只需要处理少数文本文件。
所以我创建了一个基类,它将接受一个FileInfo
参数,但问题是如何为实例赋值?在基类中,它不知道属性名称是什么。我想我应该遍历属性并按索引分配它们,但t.GetType().GetProperties()
不会返回任何项目。
public class AccountDataFile : DataFileBase<AccountDataFile.Account>
{
public class Account
{
public string Name;
public string Type;
}
public AccountDataFile(FileInfo fiDataFile) : base(fiDataFile) { }
}
基类:
public class DataFileBase<T> where T : new()
{
public List<T> Data;
public DataFileBase(FileInfo fi)
{
this.Data = new List<T>();
var lines = fi.ReadLines();
foreach (var line in lines)
{
var tokens = line.Split(CONSTS.DELIMITER);
var t = new T();
// how to assign values to properties?
this.Data.Add(t);
}
}
}
答案 0 :(得分:3)
让继承类提供实现:
public abstract class DataFileBase<T>
{
protected abstract T BuildInstance(string[] tokens);
}
public AccountDataFile : DataFileBase<AccountDataFile.Account>
{
protected override Account BuildInstance(string[] tokens)
{
var account = new Account();
account.Name = tokens[0]; // or whatever
return account;
}
}
答案 1 :(得分:1)
您可以向基类添加抽象方法以创建正确类型的对象。在DataFileBase
添加如下方法:
public abstract T CreateObject();
并在AccountDataFile
中实施:
public override AccountDataFile.Account CreateObject() { new AccountDataFile.Account(); }
答案 2 :(得分:1)
考虑现有的CSV parser/reader for C#?。
如果您仍想获得自己的 - 许多序列化程序使用属性来执行属性到字段名称/列匹配。即使用ColumnAttribute或类似的自定义属性注释您的Account
类型,并在运行时读取值。 MSDN的文章Accessing Attributes by Using Reflection涵盖了阅读属性。
// starting point to read attributes:
System.Attribute[] attrs = System.Attribute.GetCustomAttributes(myType);