如何为T类型的实例赋值?

时间:2014-05-12 16:24:54

标签: c# generics

我有一些用逗号分隔的文本文件,我想读取一行,然后实例化它并为属性赋值。文本文件的数量将来会增长,但现在,我只需要处理少数文本文件。

所以我创建了一个基类,它将接受一个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);
        }
    }
}

3 个答案:

答案 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);