首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >从csv文件列动态创建类及其属性

从csv文件列动态创建类及其属性
EN

Stack Overflow用户
提问于 2022-09-28 10:47:02
回答 1查看 98关注 0票数 -4

我有一个csv文件,有3列。有时csv会有4或5列。我们无法预测。不管是什么,我都希望在运行时根据csv文件中的列创建一个具有属性的类。我创建了一个这样的类。

代码语言:javascript
运行
复制
      public class ModalClass : DynamicObject
      {
       private Dictionary<string, object> _propbag = new Dictionary<string, object>();
       private object _outputvals = null;
    
    public DateTime Date
    {
        get;
        set;
    }
    public Dictionary<string, object> PropertyBag
    {
        get
        {
            return _propbag;
        }
        set
        {
            _propbag = value;
        }
    }


    public object OutPutValue
    {
        get
        {
            return _outputvals;
        }
        set
        {
            _outputvals = value;
        }
    }

    public int Count
    {
        get
        {
            return PropertyBag.Count;
        }
    }

    public override bool TryGetMember(GetMemberBinder binder, out object result)
    {
        string name = binder.Name;
        return PropertyBag.TryGetValue(name, out result);
    }

    public override bool TrySetMember(SetMemberBinder binder, object value)
    {
        PropertyBag[binder.Name] = value;
        return true;
    }

    public void AddProperty<TTValue>(string key, TTValue value = default(TTValue))
    {
        PropertyBag[key] = value;
    }

    public void AddProperty(string typeName, string key, object value = null)
    {
        Type type = Type.GetType(typeName);

        if ((type = value as Type) != null)
        {
            PropertyBag[key] = Convert.ChangeType(value, type);
        }
        else
        {
            if (value.GetType().ToString() == "Null")
            {
                PropertyBag[key] = null;
            }
            else
            {
                PropertyBag[key] = value;
            }

        }

    }
}

在我的c#类中,我有读取csv文件并尝试动态生成类属性的代码。

代码语言:javascript
运行
复制
private List<ModalClass> ReadCSV()
    {
        List<ModalClass> lstValues = new List<ModalClass>();

        CsvConfiguration csvConfiguration = new CsvConfiguration(CultureInfo.InvariantCulture)
        {
            HasHeaderRecord = true,
            Delimiter = ",",
            PrepareHeaderForMatch = args => args.Header.ToUpper(),
            UseNewObjectForNullReferenceMembers = true
        };

        CsvReader csv = new CsvReader(File.OpenText("C:\\Users\\sunil\\Desktop\\MyCSV.csv"), csvConfiguration);
        csv.Read();
        csv.ReadHeader();

        while (csv.Read())
        {
            string d0 = csv.GetField<string>("DATETIME");
            double? d5 = csv.GetField<double?>("SECONDS");

            if (!string.IsNullOrEmpty(d0))
            {
                DateTime dt = DateTime.Parse(d0, CultureInfo.InvariantCulture).AddMilliseconds(d5.HasValue == true ? d5.Value : 0);

                Dictionary<string, double> item = new Dictionary<string, double>();

                foreach (string str in columns)
                {
                    var d1 = csv.GetField<double>(str);
                    item.Add(str, d1);
                }

                ModalClass spData = new ModalClass();
                spData.Date = dt;
               
                foreach (KeyValuePair<string, double> entry in item)
                {
                    //adding datatype, column name and the value
                    spData.AddProperty("double", entry.Key, entry.Value);                        
                }

                lstValues.Add(spData);
            }
          
        }

        return lstValues;
    }      

这将在视图模型的构造函数中使用,如下所示:

代码语言:javascript
运行
复制
        List<string> columns = new List<string>();
        columns.Add("AA"); // suppose these are the 4 columns in the csv file.
        columns.Add("CC");
        columns.Add("XC");
        columns.Add("QWS");

        Data = new ObservableCollection<ModalClass>(ReadCSV());

但这些数据没有"AA“、"CC”、"XC“或"QWS”属性!如何在C#中动态创建类和属性?这里我使用WPF应用程序。

刚添加:如何将属性包与xaml属性绑定?

以下是数据收集的屏幕截图:

我不知道在这里该怎么办。

代码语言:javascript
运行
复制
  private void Window_Loaded(object sender, RoutedEventArgs e)
    {
        ViewModel vm = new ViewModel();
        foreach (var str in vm.Data)
        {
            LineSeries lineSeries = new LineSeries();
            lineSeries.ItemsSource = new ViewModel().Data; // works
            lineSeries.XBindingPath = "Date"; // works
            lineSeries.YBindingPath = "str[0]"; // PropertyBag["AA"] here what to do ??
            
            chart.Series.Add(lineSeries);
        }
        this.DataContext = vm;
    }

这是用来绘制图表的。我希望根据csv文件中的列标题值生成Y轴数据。在YBindingPath中,值将是PropertyBag"AA“。我不知道怎么做。

EN

回答 1

Stack Overflow用户

发布于 2022-09-28 11:16:43

如何将属性包与xaml属性绑定?

绑定到PropertyBag属性并指定动态“属性”的键,例如:

代码语言:javascript
运行
复制
<TextBlock Text="{Binding PropertyBag[AA]}" />

视图模型:

代码语言:javascript
运行
复制
public class ViewModel
{
    private Dictionary<string, object> _propbag = new Dictionary<string, object>()
    {
        { "AA", "value..." }
    };

    public Dictionary<string, object> PropertyBag
    {
        get
        {
            return _propbag;
        }
        set
        {
            _propbag = value;
        }
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73880167

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档