创建新的T,X并使用反射C#填充类

时间:2019-06-11 19:05:13

标签: c#

小背景:

  • 我正在从文本文件中读取数据
  • 文件具有标题行,然后具有任意数量的项目行
  • 可以有多个标题/项目部分
  • 我创建了一个映射(xml)并将其加载到对象中,该对象详细说明1)位置2)必需3)数据类型4)类属性名称以将其填充到(Header / Item)

我的解决方案

由于我们具有不同映射的文件,因此我走了通用函数路线来读取文件并构建相应的对象以供处理器稍后使用。

如下面的图片所示,该方法正在起作用。但是我不认为我对T和X都正确/优化地处理了 function Plotslope x=-5:0.6:5; y=-6:0.6:6; delta=0.2; hold on axis([-5,5,-6,6]) daspect([1,1,1]) for k=1:length(x) for m=1:length(y) eps=delta/(sqrt(1+ff(x(k),y(m))^2)); plot([x(k)-eps, x(k)+eps],... [y(m)-eps*ff(x(k),y(m)),... y(m)+eps*ff(x(k),y(m))],'k'); plot(x(k),y(m),'k.','LineWidth',0.2) end end [x0,y0]=ginput(1); plot(x0,y0,'bo') [T,Y]=ode45(@ff,[x0,5],y0); [T1,Y1]=ode45(@ff,[x0,-6],y0); plot(T,Y,'r',T1,Y1,'r') function z=ff(x,y) z=(y*x)/(2*(x^2+4))+x/2; end end ,尤其是在new()中对X的处理。关于如何使它变得更好的任何建议?

enter image description here

用于保存数据的模型类

FillItems

样本读取文件实用程序(为简单起见,不包括文件读取部分)

public class Header
{
    public string Id { get; set; }
    public string Description { get; set; }
    public List<Item> Items { get; set; }
}

public class Item
{
    public string Id { get; set; }
    public string Description { get; set; }
}

最后是调用部分

public static class Utility
{
    public static List<T> LoadData<T, X>() where T: new()
    {
        List<T> headers = new List<T>();

        //using relections to read file and fill
        PropertyInfo[] myMainProperties = typeof(T).GetProperties();

        var head = new T();
        foreach (var p in myMainProperties)
        {
            switch (p.Name)
            {
                case "Id":
                    p.SetValue(head, "1");
                    break;
                case "Description":
                    p.SetValue(head, "Some thing");
                    break;
                case "Items":
                    var items = FillItems<X>();
                    p.SetValue(head, items);
                    break;
            }
        }

        headers.Add(head);

        return headers;
    }

    //cant use where X: new(), on FillItems call above rueults in an error => get X should be non abstract type
    private static List<X> FillItems<X>() 
    {
        List<X> items = new List<X>();

        PropertyInfo[] myItemsProperties = typeof(X).GetProperties();

        //is there a better way to handle this. 
        X item = default(X);
        item = Activator.CreateInstance<X>();

        foreach (var p in myItemsProperties)
        {
            switch (p.Name)
            {
                case "Id":
                    p.SetValue(item, "1");
                    break;
                case "Description":
                    p.SetValue(item, "Item Some thing");
                    break;
            }
        }

        items.Add(item);

        return items;
    } 

}

我对T和X都使用var myMain = Utility.LoadData<Header, Item>(); 感到困惑。只想确保我在这里不会错过更好的方法。

0 个答案:

没有答案