小背景:
我的解决方案
由于我们具有不同映射的文件,因此我走了通用函数路线来读取文件并构建相应的对象以供处理器稍后使用。
如下面的图片所示,该方法正在起作用。但是我不认为我对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的处理。关于如何使它变得更好的任何建议?
用于保存数据的模型类
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>();
感到困惑。只想确保我在这里不会错过更好的方法。