简体   繁体   English

在C#中动态填充对象

[英]Dynamically populating an object in C#

I have an excel sheet with cells . 我有一个带有单元格的Excel工作表。 I want to read and populate an object at runtime. 我想在运行时读取并填充对象。 This is what I tried. 这就是我尝试过的。

dynamic Common = new JObject();

foreach (DataRow dsRow in dtTable.Rows)
{
    // On all tables' columns
    foreach(DataColumn dc in dtTable.Columns)
    {

    var columnName = dc.ColumnName;
        Common.columnName = dsRow[dc].ToString();
    }
}

But the problem here is dtoCommonTag.columnName is constant for all the columns from dsRow[dc].ToString() . 但是这里的问题是dtoCommonTag.columnName对于dsRow[dc].ToString()所有列都是常量。

How do I dynamically change the key values of Common ? 如何动态更改Common键值

Two options here: 这里有两个选择:

Have you tried 你有没有尝试过

Common[columnName] = dsRow[dc].ToString();

Worst case scenario, you can write a switch statement to affect every column. 最坏的情况是,您可以编写一个switch语句来影响每一列。 It won't be pretty but it will work. 它不会很漂亮,但是会起作用。

That is not how dynamic objects work. 这不是dynamic对象的工作方式。 You can dynamically add properties to a dynamic object, but not "by string". 您可以向动态对象动态添加属性,但不能“按字符串”添加属性。

You can, however, use an ExpandoObject to do that: 但是,您可以使用ExpandoObject来做到这一点:

var x = new ExpandoObject() as IDictionary<string, Object>;
x.Add(columnName, dsRow[dc].ToString());

dynamic dyn = x;

Then you can use the column names as properties. 然后,您可以将列名称用作属性。

Use "Reflection". 使用“反射”。 Then you can pass the property name as a string value and then pass a value to that property. 然后,您可以将属性名称作为字符串值传递,然后将值传递给该属性。 Try this 尝试这个

FieldInfo info = typeof(Common).GetField(dc.ColumnName);
info.SetValue(null, dsRow[dc].ToString())

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM