-1

我不确定我是否正确解释了这一点,或者问题是否足够清楚,但这就是我想要做的。

我创建了一个名为 index 的对象,它存储 IList 中元素的索引。这是我的对象索引。

var index = new
                {
                    PhoneReportID = 1,
                    CSQID = i.NextIndex(),
                    CallsPresented = i.NextIndex(),
                    AvgQueueTime = i.NextIndex(),
                    CallsHandled = i.NextIndex(),
                    AvgAnswerSpeed = i.NextIndex(),
                    AvgHandleTime = i.NextIndex(),
                    CallsAbandoned = i.NextIndex(),
                    AvgAbandonTime = i.NextIndex(),
                    AvgCallsAbandoned = i.NextIndex(),
                    CallsDequeued = i.NextIndex(),
                    AvgDequeueTime = i.NextIndex(),
                    CallsHandledByOther = i.NextIndex(),
                    MaxQueueTime = z.NextIndex(),
                    MaxHandleTime = z.NextIndex(),
                    MaxAbandonTime = z.NextIndex(),
                    MaxCallsAbandoned = z.NextIndex(),
                    MaxDequeueTime = z.NextIndex(),

                };

这是我的泛型方法,它从泛型类型获取属性并根据索引中的元素位置设置值。

 private IEnumerable<T> Parse(IList<string[]> rows, object index)
        {
            Type indexType = index.GetType();
            IList<PropertyInfo> indexProperties = indexType.GetProperties();
            int k = 0;

            var classType = typeof(T);
            IList<PropertyInfo> classProperties = classType.GetProperties();

            foreach (var property in classProperties)//.Select(x => x.ToString()).Select(y => y.Trim()).ToList())
            {
                var propGetter = property.GetGetMethod();
                var propSetter = indexType.GetProperty(property.Name).GetSetMethod();
                var valueToSet = rows[int.TryParse(index[indexType.GetProperty(property.Name)],out k)];


            }
            throw new Exception();
        }

我这样做的原因有很多,但我这样做的主要原因之一是学习 c# 中的反射。

因此,行是通过读取具有特定分隔符的文件获得的列表。由于列表中的每个值都对应于类的某些属性,因此我创建了一个名为 index 的对象,其名称与类的属性名称相同,并为其分配了值在 IList 中的位置。现在,我想使用索引的属性名称检索行中的值,该索引返回类的属性名称与对象索引的属性名称相同的位置。我上面所做的方式对于检索值是不正确的,但我写它是为了清楚我打算实现的目标。希望我足够清楚,有人可以回答这个问题。

4

1 回答 1

2
private IEnumerable<T> Deserialize<T>(IList<string[]> rows, object index)
    where T : new()
{
    Type indexType = index.GetType();
    IList<PropertyInfo> indexProperties = indexType.GetProperties();

    var dtoType = typeof(T);
    IList<PropertyInfo> dtoProperties = dtoType.GetProperties();

    var setters = new List<Tuple<int,PropertyInfo>>();

    foreach (var dtoProperty in dtoProperties)
    {
        var indexProperty = indexType.GetProperty(dtoProperty.Name);
        var columnIndex = (int) indexProperty.GetValue(index);

        setters.Add(Tuple.Create(columnIndex, dtoProperty));
    }

    foreach (var row in rows)
    {
        var dto = new T();
        foreach (var pair in setters)
        {
            var colIndex = pair.Item1;
            var prop = pair.Item2;
            prop.SetValue(dto, row[colIndex]);
        }
        yield return dto;
    }
}
  • where T : new() is a generic constraint, to only allow types with parameter-less constructors. It allows you to use new T() later, without the compiler screaming at you.
  • I used PropertyInfo.GetValue(object) and PropertyInfo.SetValue(object, object) instead of accessing the get- and set-methods directly, since it is easier.
于 2015-02-17T00:59:55.163 回答