Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/15.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,如何从生成的LINQ类动态访问属性 因为我希望能够自定义显示的表列 其中Partner是从SQLServer数据库表生成的LINQ类 <table class="grid"> <thead> <tr> <% foreach (Column c in (IEnumerable)ViewData["columns"]) { %> <th><%= c.Title %></th>

如何从生成的LINQ类动态访问属性

因为我希望能够自定义显示的表列 其中Partner是从SQLServer数据库表生成的LINQ类

<table class="grid">
  <thead>
   <tr>
     <% foreach (Column c in (IEnumerable)ViewData["columns"]) { %>
     <th><%= c.Title %></th>    
     <% } %>                               
   </tr>
 </thead>
 <tbody>
 <% foreach (Partner p in (IEnumerable)ViewData.Model) { %>
   <tr>
     <% foreach (Column c in (IEnumerable)ViewData["columns"]) { %>
?????   <th> <%= p.GetProperty(c.Name) %>  </th>  ?????
     <% } %>         
   </tr>       
 <% } %>
  </tbody>
</table>

?????        ?????
你知道
p.GetProperty(c.Name)
方法的代码是什么样子吗

如果问题很简单,请原谅,但我对C#and LINQ还不熟悉,我真的
无法理解。

我相信以下几点可以满足您的要求:

p.GetType().GetProperty(c.Name).GetValue(p)

反思应该提供你想要的——特别是

typeof(Partner).GetProperty(c.Name).GetValue(p, null)
但是,您可能希望在循环之前执行此操作:

var columns = (IEnumerable<string>)ViewData["columns"];
var cols = columns.Select(colName =>
      typeof(Partner).GetProperty(colName)).ToList();
(顺便问一下,那个
应该是
吗?)


这应该比重复查找每个属性更有效率。还有(更快的)。

反射非常适合这里,但事实上,一切都是在编译时知道的。因此,可以在设计时指定所有内容

public class DataItem
{
  string Title {get;set;}
  object Value {get;set;}
}

public interface IDataItems
{
  IEnumerable<DataItem> Items()
}


//suppose LINQ gives you this:
public partial class Customer
{
  public string Name {get;set;}
  public string Address {get;set;}
  public int Age {get;set;}
}

//then you add this in another file.
//if there's a lot of this, it can be code genned by design-time reflection
public partial class Customer : IDataItems
{
  public IEnumerable<DataItem> IDataItems.Items()
  {
    yield return new DataItem() {"Name", Name};
    yield return new DataItem() {"Address", Address};
    yield return new DataItem() {"Age", Age};
  }
}

//and the foreach loops look like this:
foreach(DataItem d in ViewData.OfType<IDataItems>().First().Items())
{
  d.Title;
}

foreach(IDataItems container in ViewData.OfType<IDataItems>())
{
    foreach(DataItem d in container.Items())
    {
       d.Value;
    }
}
公共类数据项
{
字符串标题{get;set;}
对象值{get;set;}
}
公共接口IDataItems
{
IEnumerable Items()
}
//假设LINQ为您提供以下信息:
公共部分类客户
{
公共字符串名称{get;set;}
公共字符串地址{get;set;}
公共整数{get;set;}
}
//然后将其添加到另一个文件中。
//如果有很多这样的情况,可以通过设计时反射来生成代码
公共部分类客户:IDataItems
{
公共IEnumerable IDataItems.Items()
{
返回新的DataItem(){“Name”,Name};
返回新的DataItem(){“Address”,Address};
返回新的数据项(){“Age”,Age};
}
}
//foreach循环如下所示:
foreach(ViewData.OfType().First().Items()中的数据项d)
{
d、 头衔;
}
foreach(ViewData.OfType()中的IDataItems容器)
{
foreach(container.Items()中的数据项d)
{
d、 价值观;
}
}

不。这些不是答案。我刚找到它

这家伙正在使用一个通过强制转换匿名类型的动态类型示例。不需要类定义或Linq的特殊扩展方法!这太酷了

这是其中一个为匿名类型的动态搜索打开了一些巨大可能性的日子

var anonymousTypeExample = new { startYear = 2000, endYear = 2000, model = "test" };
var list = (new[] { anonymousTypeExample }).ToList();

list.Clear();

list.Add(new{
    startYear = 1990,
    endYear = 2004,
    model = "Honda"
});
list.Add(new
{
    startYear = 1989,
    endYear = 1989,
    model = "KTM"
});
list.Add(new
{
    startYear = 1989,
    endYear = 1989,
    model = "KTM"
});

list = list.OrderBy(l => l.startYear).ToList();

foreach(var l in list)
{
    <div>@l.model @l.startYear - @l.endYear</div>
}
var anonymousTypeExample=new{startYear=2000,endYear=2000,model=“test”};
var list=(新[]{anonymousTypeExample}).ToList();
list.Clear();
列表。添加(新){
startYear=1990,
年底=2004年,
model=“本田”
});
列表。添加(新)
{
startYear=1989,
年底=1989年,
model=“KTM”
});
列表。添加(新)
{
startYear=1989,
年底=1989年,
model=“KTM”
});
list=list.OrderBy(l=>l.startYear.ToList();
foreach(列表中的变量l)
{
@l、 型号@l.startYear-@l.endYear
}

谢谢!简单的工作解决方案,无需大量的编码工作!但就性能而言,我选择了Marc的解决方案,不再为每一行确定属性参考。Marc,作为Sander的解决方案,它的工作原理与您在第一个方案中概述的一样,但我更倾向于第二个更注重性能的方案;-)谢谢PS:当然应该是标签!因为它是代码密集度最高的解决方案,所以我上一次尝试了它,但由于我的目标是获得最佳性能,因此我将坚持使用此解决方案!谢谢
var anonymousTypeExample = new { startYear = 2000, endYear = 2000, model = "test" };
var list = (new[] { anonymousTypeExample }).ToList();

list.Clear();

list.Add(new{
    startYear = 1990,
    endYear = 2004,
    model = "Honda"
});
list.Add(new
{
    startYear = 1989,
    endYear = 1989,
    model = "KTM"
});
list.Add(new
{
    startYear = 1989,
    endYear = 1989,
    model = "KTM"
});

list = list.OrderBy(l => l.startYear).ToList();

foreach(var l in list)
{
    <div>@l.model @l.startYear - @l.endYear</div>
}