我正在开发一个具有图表工具的网站,允许用户选择最多3个属性显示在图表上。
我有一个结构类似于以下内容的数据库:
boost::optional
我需要用户能够选择最多3个属性,然后在对象中返回。
public class MyClass
{
public decimal Field1 {get;set;}
public decimal Field2 {get;set;}
...
public decimal Field10 {get;set;}
}
该网站包含三个下拉菜单,用户可以选择他们想要绘制的10个字段中的哪一个作为值1,2或3。
因此,传递给控制器的值将是一个详细说明列名的字符串,但是由于Linq是强类型的,因此两者不能互换。
如何编写非强类型的Linq命令,而是使用用户传入的文本作为列名?
以下内容是理想的,但不起作用。
public class MyResult
{
public decimal value1 {get;set;}
public decimal value2 {get;set;}
public decimal value3 {get;set;}
}
或者我只是以完全错误的方式看待这个?有没有更好的方法来实现这一目标?
答案 0 :(得分:2)
它不是LinQ,但您可以考虑使用AutoMapper,在这种情况下它非常方便。
样品:
Mapper.CreateMap<MyClass, MyResult>()
.ForMember(dest => dest.Field1, opt => opt.MapFrom(src => src.Value1))
.ForMember(dest => dest.Field2, opt => opt.MapFrom(src => src.Value2))
.ForMember(dest => dest.Field3, opt => opt.MapFrom(src => src.Value3))
以后你可以打电话:
MyResult result = Mapper.Map<MyClass>(class);
答案 1 :(得分:1)
使用Reflection
,您可以获取具有其姓名的类的属性值。这是代码:
public object GetPropertyOfMyClass(string propertyName, MyClass instance)
{
System.Reflection.PropertyInfo[] properties = typeof(MyClass).GetProperties();
return properties.Single(i => i.Name == propertyName).GetValue(instance);
}
然后像这样使用它:
values.Select(x => new MyResult(){
value1 = (decimal)GetPropertyOfMyClass("Field1",x),
value2 = (decimal)GetPropertyOfMyClass("Field5",x),
value3 = (decimal)GetPropertyOfMyClass("Field9".x)});