Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 按文本选择Linq中的列名_C#_Asp.net Mvc_Linq - Fatal编程技术网

C# 按文本选择Linq中的列名

C# 按文本选择Linq中的列名,c#,asp.net-mvc,linq,C#,Asp.net Mvc,Linq,我在一个网站上工作,该网站有一个绘图工具,允许用户选择最多3个属性显示在图形上 我有一个结构类似于以下的数据库: public class MyClass { public decimal Field1 {get;set;} public decimal Field2 {get;set;} ... public decimal Field10 {get;set;} } 我需要用户能够选择最多3个属性,然后在对象中返回 public class MyResult

我在一个网站上工作,该网站有一个绘图工具,允许用户选择最多3个属性显示在图形上

我有一个结构类似于以下的数据库:

public class MyClass
{
    public decimal Field1 {get;set;}
    public decimal Field2 {get;set;}
    ...
    public decimal Field10 {get;set;}
}
我需要用户能够选择最多3个属性,然后在对象中返回

public class MyResult
{
    public decimal value1 {get;set;}
    public decimal value2 {get;set;}
    public decimal value3 {get;set;}
}
该网站包含三个下拉列表,用户可以从10个字段中选择哪一个字段作为值1、2或3

因此,传递到控制器的值将是一个详细说明列名的字符串,但是由于Linq是强类型的,所以两者不能互换

如何编写不是强类型的Linq命令,而是使用用户传入的文本作为列名

像下面这样的东西本来是理想的,但不起作用

values.Select(x => new MyResult(){ value1 = "Field1", value2 = "Field5", value3 = "Field9"});

还是我只是完全错误地看待这个问题?有没有更好的方法来实现这一点?

使用
反射
可以获得类的属性值,并带有它们的名称。代码如下:

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)});

这不是LINQ,但您可以考虑使用AutoPAPER,在这种情况下非常方便。 样本:

 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))
Mapper.CreateMap()
.FormMember(dest=>dest.Field1,opt=>opt.MapFrom(src=>src.Value1))
.FormMember(dest=>dest.Field2,opt=>opt.MapFrom(src=>src.Value2))
.FormMember(dest=>dest.Field3,opt=>opt.MapFrom(src=>src.Value3))
稍后您可以拨打:

MyResult result = Mapper.Map<MyClass>(class);
MyResult=Mapper.Map(类);

你可以通过
反射
来实现这一点。正如其他人所提到的,
反射
就是你在这里寻找的东西。但你应该知道,在这种情况下,它可能真的会扼杀你的表现。我发布了一个答案,让我知道它是否解决了你的问题。