我是C#中使用动态对象的新手。我正在阅读与以下代码类似的CSV文件:http://my.safaribooksonline.com/book/programming/csharp/9780321637208/csharp-4dot0-features/ch08lev1sec3
我可以使用静态名称引用我需要的数据,但是在运行时使用动态名称无法找到正确的语法引用。
例如我有:
var records = from r in myDynamicClass.Records select r;
foreach(dynamic rec in records)
{
Console.WriteLine(rec.SomeColumn);
}
如果你知道“SomeColumn”这个名字,这个工作正常。我希望列名是字符串,并且能够在运行时生成相同类型的参考。
答案 0 :(得分:3)
由于必须创建一个继承自DynamicObject
的类,只需在类中添加一个索引器即可通过字符串获得结果。
以下示例使用书籍示例中的相同属性,包含具有列名的各个行数据的属性。下面是该类的索引器,以实现结果:
public class myDynamicClassDataLine : System.Dynamic.DynamicObject
{
string[] _lineContent; // Actual line data
List<string> _headers; // Associated headers (properties)
public string this[string indexer]
{
get
{
string result = string.Empty;
int index = _headers.IndexOf(indexer);
if (index >= 0 && index < _lineContent.Length)
result = _lineContent[index];
return result;
}
}
}
然后访问
等数据var csv =
@",,SomeColumn,,,
ab,cd,ef,,,"; // Ef is the "SomeColumn"
var data = new myDynamicClass(csv); // This holds multiple myDynamicClassDataLine items
Console.WriteLine (data.OfType<dynamic>().First()["SomeColumn"]); // "ef" is the output.
答案 1 :(得分:1)
您需要使用反射。获取您将使用的名称:
List<string> columnNames = new List<string>(records.GetType().GetProperties().Select(i => i.Name));
然后,您可以遍历结果并输出每列的值,如下所示:
foreach(dynamic rec in records)
{
foreach (string prop in columnNames)
Console.Write(rec.GetType().GetProperty (prop).GetValue (rec, null));
}
答案 2 :(得分:0)
试试这个
string column = "SomeColumn";
var result = rec.GetType().GetProperty (column).GetValue (rec, null);