无法在 c# 中使用“动态”从数据项获取值

本文关键字:动态 数据项 获取 | 更新日期: 2023-09-27 18:35:59

我正在使用Telerik RadGrid的NeedDataSource事件绑定到匿名类型。

现在,OnItemDataBound用于在RadGrid中绑定DropDownList。

protected void rgQuotations_ItemDataBound(object sender, GridItemEventArgs e)
{
    if (e.Item is GridDataItem)
    {
        dynamic di = e.Item.DataItem;
        DropDownList ddlStatus = (e.Item.FindControl("ddlStatus") as DropDownList);
        if (di.Status == 4)
        {
            ddlQuoteStatus.Items.Add("4");
        }  
    }
}

当它尝试获取 di.Status 的值时,它会抛出异常

System.Core 中发生类型为"Microsoft.CSharp.RuntimeBinder.RuntimeBinderException"的异常.dll但未在用户代码中处理

附加信息:"对象"不包含"状态"的定义

但是我将鼠标悬停在它上面可以清楚地看到价值。

如何在不出错的情况下获取此值?

无法在 c# 中使用“动态”从数据项获取值

如 C# 中所述,"dynamic"无法访问在另一个程序集中声明的匿名类型的属性,不能使用在另一个程序集中创建的匿名对象,因为它是内部的。

由于您控制实例化对象的程序集,因此有一种可能的解决方法(链接答案中未提及,因此我在此处添加答案)。通过添加程序集属性,可以使原始程序集内部类型在使用对象的程序集中可见InternalsVisibleTo

// in assembly where you create the anonymous object
// and assuming the assembly where you use it in Grid is called Xyz
[assembly:InternalsVisibleTo("Xyz")]