如何将对象转换为不同程序集中的匿名类型?

Bru*_*oLM 2 c# datasource dynamic anonymous-types .net-4.0

我有一个GridView地方DataSource:

items.Select(i => new { ID = i.ID, Foo = i }).ToList();
Run Code Online (Sandbox Code Playgroud)

RowDataBound我想要访问的对象,但我不知道如何投射它...

grid.RowDataBound += (s, e) =>
{
    if (e.Row.RowType == DataControlRowType.DataRow)
    {
        dynamic item = e.Row.DataItem as 'what?';
    }
};
Run Code Online (Sandbox Code Playgroud)

如何访问此对象属性?


重现步骤

  1. 创建一个网站
  2. 创建一个页面(default.aspx)并放置一个 <asp:GridView ID="grid" runat="server" />
  3. 在后面的代码中:

protected void Page_Load(object sender, EventArgs ev)
{
    var provider = new FooProvider();

    grid.DataSource = provider.Elements;
    grid.RowDataBound += (s, e) =>
    {
        if (e.Row.RowType == DataControlRowType.DataRow)
        {
            dynamic item = e.Row.DataItem;

            var test = item.ID;
        }
    };
    grid.DataBind();
}
Run Code Online (Sandbox Code Playgroud)
  1. 创建一个类库项目
  2. 添加文件 FooProvider.cs

码:

public class FooProvider
{
    public IEnumerable<dynamic> Elements
    {
        get
        {
            return new int[] { 1, 2, 3 }
                .Select(i => new { ID = i, Foo = i * 3 }).ToList();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

然后在网站上添加参考.


预期结果:获取匿名对象的ID.

目前的结果:

用户代码未处理RuntimeBinderException

'object'不包含'ID'的定义


反思是唯一的方法吗?

Amy*_*y B 8

不要使用匿名类型.上课.

public class MyCustomRow
{
  int ID {get;set;}
  Foo Foo {get;set;}
}
Run Code Online (Sandbox Code Playgroud)

(wtf?动态?)

  • 为了更加通用,匿名类型是一种便利,当类型仅在代码中的单个位置使用并且永远不需要通过名称引用时,可以使用匿名类型.你正在做一些按名称引用你的类型的东西,因此你不能使用匿名类型. (2认同)