我有一个csv文件,有3列。有时csv会有4或5列。我们无法预测。不管是什么,我都希望在运行时根据csv文件中的列创建一个具有属性的类。我创建了一个这样的类。
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文件并尝试动态生成类属性的代码。
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;
}
这将在视图模型的构造函数中使用,如下所示:
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属性绑定?
以下是数据收集的屏幕截图:
我不知道在这里该怎么办。
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“。我不知道怎么做。
发布于 2022-09-28 11:16:43
如何将属性包与xaml属性绑定?
绑定到PropertyBag
属性并指定动态“属性”的键,例如:
<TextBlock Text="{Binding PropertyBag[AA]}" />
视图模型:
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;
}
}
}
https://stackoverflow.com/questions/73880167
复制相似问题