C# 在对象和类的属性名称都匹配的情况下,如何使用类的属性名称和对象索引获取ILST的索引?
我不确定我是否正确地解释了这个问题,或者这个问题是否足够清楚,但以下是我想做的 我创建了一个名为index的对象,它将元素的索引存储在IList中。这是我的ojbect索引C# 在对象和类的属性名称都匹配的情况下,如何使用类的属性名称和对象索引获取ILST的索引?,c#,reflection,generic-method,C#,Reflection,Generic Method,我不确定我是否正确地解释了这个问题,或者这个问题是否足够清楚,但以下是我想做的 我创建了一个名为index的对象,它将元素的索引存储在IList中。这是我的ojbect索引 var index = new { PhoneReportID = 1, CSQID = i.NextIndex(), CallsPresented = i.NextInde
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语言中的反射
因此,行是一个列表,它是通过读取具有特定delimeter的文件获得的。由于列表中的每个值都对应于类的某些属性,因此我创建了一个名为index的对象,其名称与类的属性名称相同,并将该值在IList中的位置指定给它。现在,我想使用索引的属性名检索行中的值,该索引返回类的属性名与对象索引的属性名相同的位置。我在上面所做的方式对于检索值是不正确的,但我写它是为了清楚我想要实现什么。希望我足够清楚,有人能回答这个问题
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;
}
}
其中T:new是一个泛型约束,只允许具有无参数构造函数的类型。它允许您稍后使用新的T,而无需编译器对您尖叫。
我使用了PropertyInfo.GetValueobject和PropertyInfo.SetValueobject对象,而不是直接访问get和set方法,因为这样更容易。